asp.net 正在从GridView单元格获取字符串值

cczfrluj  于 2023-01-06  发布在  .NET
关注(0)|答案(1)|浏览(139)

我正在学习如何根据特定列的值更改GridView行的颜色的教程:https://www.youtube.com/watch?v=F7ADEYhwqxk,但我找不到该行的替代方案:

int stock = Convert.ToInt32(GridView1.Rows[i].Cells[4].Text);

这一行产生了一个int的值,但是我需要一个string的值。

string cell = Convert.ToString(GridView1.Rows[i].Cells[11].Text);

以及

string cell = (GridView1.Rows[i].Cells[11].Text);

但都没有从GridView列中获取特定值并将其存储在字符串中。
更新:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True"
                            AutoGenerateColumns="False" DataKeyNames="ID"
                            DataSourceID="SqlAdmin" OnRowDataBound="GridView1_RowDataBound" PageSize="150" Width="100%">
                            <Columns>
                                <asp:BoundField DataField="ID" HeaderText="ID" SortExpression="ID" InsertVisible="False" ReadOnly="True" Visible="False"></asp:BoundField>

                                <asp:TemplateField HeaderText="Comment" SortExpression="COMMENT">
                                    <ControlStyle Width="800px" />
                                    <HeaderStyle Wrap="False" />
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txtCOMMENT" runat="server" Text='<%# Bind("COMMENT") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                    <ItemTemplate>
                                        <asp:TextBox ID="COMMENTtxt" runat="server"
                                            Text='<%# Bind("COMMENT") %>'></asp:TextBox>
                                    </ItemTemplate>
                                    <ItemStyle HorizontalAlign="Center" />
                                </asp:TemplateField>

                                <asp:TemplateField HeaderText="Part #" SortExpression="PART_NO">
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txtPartNo" runat="server" Text='<%# Bind("PART_NO") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                    <ItemTemplate>
                                        <asp:TextBox ID="PartNotxt" runat="server"
                                            Text='<%# Bind("PART_NO") %>'></asp:TextBox>
                                    </ItemTemplate>
                                    <ControlStyle Width="150px" />
                                    <ItemStyle HorizontalAlign="Center" />
                                </asp:TemplateField>

                                <asp:TemplateField HeaderText="Notes" SortExpression="NOTE">
                                    <EditItemTemplate>
                                        <asp:TextBox ID="txtNOTE" runat="server" Text='<%# Bind("NOTE") %>'></asp:TextBox>
                                    </EditItemTemplate>
                                    <ItemTemplate>
                                        <asp:TextBox ID="NOTEtxt" runat="server"
                                            Text='<%# Bind("NOTE") %>'></asp:TextBox>
                                    </ItemTemplate>
                                    <ControlStyle Width="500px" />
                                    <ItemStyle HorizontalAlign="Center" />
                                </asp:TemplateField>

更改颜色:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            for (int i = 0; i < GridView1.Rows.Count; i++)
            {
                TextBox COMMENTtxt = (TextBox)gRow.FindControl("COMMENTtxt");

                if (COMMENTtxt == "x")
                {
                    GridView1.Rows[i].BackColor = Color.Yellow;
                }
                else
                {
                    GridView1.Rows[i].BackColor = Color.White;
                }
            }
        }
5kgi1eie

5kgi1eie1#

好吧,这就是为什么它的"往往"是一个真正的好主意,张贴一些标记。
请记住以下规则:
对于自动生成(甚至不是自动生成)的数据绑定字段,则使用. cells []集合。
但是,对于模板化列,则不能使用cells []集合,而必须使用find控件。
因此,以gv为例:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ID" CssClass="table table-hover" Width="60%" > 
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />

        <asp:TemplateField HeaderText="Active" ItemStyle-HorizontalAlign="Center">
            <ItemTemplate>
                <asp:CheckBox ID="chkActive" runat="server"
                    Checked='<%# Eval("Active") %>' />
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField HeaderText="Descripiton">
            <ItemTemplate>
                <asp:Label ID="lblDescription" runat="server"
                    Text='<%# Eval("Description") %>' />                       
                </asp:Label>
            </ItemTemplate>
        </asp:TemplateField>

        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button ID="cmdView" runat="server" Text="View" CssClass="btn"
                    OnClick="cmdView_Click" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

我们"混合"了绑定字段(细胞集合)和一些普通的jane常规控件(复选框、按钮和描述标签)。
因此,当我们单击一个行按钮时,让我们获取复选框值(活动-模板化控件-因此"查找控件"
让我们获取HotelName(绑定字段-so cells []集合)
然后让我们抓取Description(一个标签-所以再次查找控件)。
要加载的代码如下:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
        LoadData();
}

void LoadData()
{
    DataTable rstData = new DataTable();
    string strSQL =
        @"SELECT * FROM tblHotelsA ORDER BY HotelName";

    using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
    {
        using (SqlCommand cmdSQL = new SqlCommand(strSQL, conn))
        {
            conn.Open();
            rstData.Load(cmdSQL.ExecuteReader());
        }
    }
    GridView1.DataSource = rstData;
    GridView1.DataBind();
}

现在我们看到/有了这个:

好了,现在我们的row按钮click了,同样的,这个按钮只是一个普通的jane按钮,有一个click事件。
因此,按钮的代码如下所示:

protected void cmdView_Click(object sender, EventArgs e)
{
    Button btn = (Button)sender;
    GridViewRow gRow = (GridViewRow)btn.NamingContainer;

    Debug.Print($"Row index click = {gRow.RowIndex}");

    int PK = (int)GridView1.DataKeys[gRow.RowIndex]["ID"];

    Debug.Print($"Data base PK ID = {PK}");

    // get hotel name - bound field - se use cells[]
    Debug.Print($"Hotel name = {gRow.Cells[2].Text}");

    // get check box
    CheckBox chkActive = (CheckBox)gRow.FindControl("chkActive");
    Debug.Print($"Value of check box (active) = {chkActive.Checked}");

    // get label with desription
    Label lblDesc = (Label)gRow.FindControl("lblDescription");
    Debug.Print($"Descripiton text = {lblDesc.Text}");

}

输出:

Row index click = 1
Data base PK ID = 5
Hotel name = Inns of Banff
Value of check box (active) = False
Description text = All amenities including pool, hot tub, restaurant, lounge, and beauty services

因此,请注意对模板化列使用"查找控件"。
还需要注意的是,datakeys的使用。这允许我获得"隐藏"(仅服务器端-为了安全!!!)的数据库PK id,但它不会在标记中暴露,也不会在标记中要求,但一旦我有了行索引,那么我就可以获得/使用/拥有/享受数据库PK行值的使用,但永远不必包括它,也不会在GV标记中显示它。

Edit#2:更改GV中的一些颜色

在我上面的示例gv中,假设我们只想用蓝色突出显示活动的酒店,我们将突出显示HotelName(单元格集合),并突出显示描述(标签-(必须使用findcontrol)。
因此,在行数据绑定中,我们将/可能有以下代码:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // get full data bind row - NOT limted to JUST data in GV
            DataRowView gData = (DataRowView)e.Row.DataItem;

            if ((bool)gData["Active"]) {
                // highlight Hotel (cells colleciton)

                e.Row.Cells[2].BackColor = System.Drawing.Color.LightSkyBlue;

                // now lbl (description)
                Label lblDescript = (Label)e.Row.FindControl("lblDescription");
                lblDescript.BackColor = System.Drawing.Color.LightSkyBlue;
            }
        }
    }

现在我们看到这个

事实上,对于"突出显示",您可以使用Cells集合,因为即使控件也被放置在这些单元格中。然而,上面确实展示了如何获取/抓取/使用控件。
但是,对于背景颜色,我们可以使用细胞集合。
让我们把蓝色调亮一点,使用单元格,然后这样:

if ((bool)gData["Active"]) {
                // highlight Hotel (cells colleciton)
                e.Row.Cells[2].BackColor = System.Drawing.Color.LightSteelBlue;
                e.Row.Cells[4].BackColor = System.Drawing.Color.LightSteelBlue;
            }

现在我们得到这个:

相关问题