C# GridViewRow FindControl 获取/传递值

C# GridViewRow FindControl get/pass values

提问人:Mat Landers 提问时间:4/7/2021 更新时间:4/7/2021 访问量:168

问:

我有一个asp:link按钮。按下它时,我想根据选中 GridView 中的哪些复选框来获取 DetailID 列表。我有一个 lblTesting 来查看我正在生成的 DetailID 列表。我的目标是获取我传递给编辑页面的 DetailID 列表。

我已经查看了 Stack Overflow 上的几个示例,但除了选中复选框之外,我无法获得任何值。

这是我页面顶部的链接:

<span style="float:right;"><asp:Linkbutton ID="getURLLink" runat="server" Text="Edit Die Detail" OnClick="GetLink"></asp:Linkbutton></span>
<asp:Label runat="server" ID="lblTesting"></asp:Label>

这是我的 GridView:

 <asp:GridView ID="DieListDetailGridView" runat="server" AutoGenerateColumns="false" OnRowDataBound="DieListDetailGridView_RowDataBound" DataKeyNames="DieID" HeaderStyle-HorizontalAlign="Center" HorizontalAlign="Center" ForeColor="#333333" GridLines="Both">
        <RowStyle BackColor="#F5F5DC" />
        <AlternatingRowStyle BackColor = "White" ForeColor="#284775" />
        <Columns>
            <asp:TemplateField HeaderText="Edit" HeaderStyle-HorizontalAlign="Center">
                <ItemTemplate>
                    <asp:CheckBox ID="chkBox" runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="DieNum" HeaderText="Die Number"  />
            <asp:BoundField DataField="DieID" HeaderText="Die ID" Visible="false" />
            <asp:BoundField DataField="DetailID" HeaderText="Detail ID" Visible="false" />
            <asp:HyperLinkField DataTextField="DetailNum" HeaderText="Detail Number" DataNavigateUrlFields="DetailID" DataNavigateUrlFormatString="~/Tooling/DieDetail.aspx?DetailID={0}" />
            <asp:BoundField DataField="Description" HeaderText="Description" />
            <asp:BoundField DataField="MaterialType" HeaderText="Material Type" />
            <asp:BoundField DataField="Hardness" HeaderText="Hardness" />
            <asp:BoundField DataField="MinSpares" HeaderText="Min Spares" />
            <asp:BoundField DataField="MaxSpares" HeaderText="Max Spares" />
            <asp:BoundField DataField="CurrentSpares" HeaderText="Current Spares" />
            <asp:BoundField DataField="DetailNotes" HeaderText="Detail Notes" />
        </Columns>
    </asp:GridView>

还有我的 GetLink 函数:

 protected void GetLink(object sender, EventArgs e) 
        {

            // start off empty
            string DetailIDList = "";
            
            foreach (GridViewRow row in DieListDetailGridView.Rows) {

                if (row.RowType == DataControlRowType.DataRow)
                {
                    CheckBox chkBox = (row.Cells[0].FindControl("chkBox") as CheckBox);

                    string DetailID = row.Cells[3].Text;

                    if (chkBox.Checked)
                    {
                       DetailIDList = DetailIDList + DetailID + ",";
                    }
                }
            }

            // Remove the last , from the list
            DetailIDList = DetailIDList.Remove(DetailIDList.Length - 1, 1);
            // comma delimeted list of checked Detail ID's
            lblTesting.Text = DetailIDList;

            //Response.Redirect("~/Tooling/DieDetail.aspx?DetailIDList=");
        }

我无法弄清楚为什么我的 DetailID 是空的。

我试过划船。细胞[0]。FindControl(“DetailID”),但这也没有用。

我期望从 DetailID 获得的是像“28925”、“16423”等这样的整数。

我被要求不要在页面上显示该列,这就是 visible = false 的原因。我仍然需要引用 ID 才能将其传递到编辑页面。我需要对多个详细信息 ID 进行相同的编辑。

我做错了什么?

C# 查找控件 GridViewRow

评论

0赞 Mat Landers 4/7/2021
我发现如果 DetailID 是可见的,这可以工作,并给了我一个 DetailID 列表,但我需要它在不可见时工作。所以我仍在努力找出这个问题的答案。

答:

0赞 Mat Landers 4/7/2021 #1

即使数据字段设置为不可见,也要找到 ID 列表的答案,可以在另一个 StackOverflow 问题中找到: ASP.NET:当列不可见时,GridView 值设置为 null

答案是从 GridView 中删除“Visible=false”,并在创建的每一行(在列为该行添加数据后)使其不可见。

这段代码解决了我的问题:

 protected void DieListDetailGridView_RowCreated(object sender, GridViewRowEventArgs e)
        {
            e.Row.Cells[2].Visible = false;
            e.Row.Cells[3].Visible = false;
        }