【问题标题】:Problems getting the control from GridViewRow从 GridViewRow 获取控件的问题
【发布时间】:2014-05-16 21:52:53
【问题描述】:

我有一个在单击按钮时创建的网格视图。它有一些复选框,因此用户可以调整某些页面的 CRUD 访问权限,然后保存所有行。

我有另一个按钮来保存我循环遍历的行,获取要保存的 rowID 和访问权限。

我在保存时遇到问题,它在行中找不到控件,当它到达 ID= 时,我得到一个对象引用异常。如果我先进行复选框分配,我会在 C= 部分收到错误。

protected void btnSave_Click(object sender, EventArgs e)
{
    foreach (GridViewRow r in gvRights.Rows)
    {
        if (r.RowType == DataControlRowType.DataRow)
        {    
            int ID;
            ID = Convert.ToUInt16(r.Cells[0].ToString());

            bool C, R, U, D;

            CheckBox chkC = r.FindControl("chkC") as CheckBox;
            C = chkC.Checked;
            CheckBox chkR = r.FindControl("chkR") as CheckBox;
            R = chkR.Checked;
            CheckBox chkU = r.FindControl("chkU") as CheckBox;
            U = chkU.Checked;
            CheckBox chkD = r.FindControl("chkD") as CheckBox;
            D = chkD.Checked;
        }


    }
}

网格视图:

 <asp:GridView ID="gvRights" runat="server" Width="100%" BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px" CellPadding="3" GridLines="Vertical" AutoGenerateColumns="False" OnRowDataBound="gvRights_RowDataBound">
        <AlternatingRowStyle BackColor="#DCDCDC" />
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="Page ID" />
            <asp:BoundField DataField="PageName" HeaderText="Page Name" />
            <asp:BoundField DataField="PageDesc" HeaderText="Page Desc" />
            <asp:TemplateField HeaderText="Create"></asp:TemplateField>
            <asp:TemplateField HeaderText="Read"></asp:TemplateField>
            <asp:TemplateField HeaderText="Update"></asp:TemplateField>
            <asp:TemplateField HeaderText="Delete"></asp:TemplateField>
        </Columns>
        <FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
        <HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
        <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
        <RowStyle BackColor="#EEEEEE" ForeColor="Black" />
        <SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
        <SortedAscendingCellStyle BackColor="#F1F1F1" />
        <SortedAscendingHeaderStyle BackColor="#0000A9" />
        <SortedDescendingCellStyle BackColor="#CAC9C9" />
        <SortedDescendingHeaderStyle BackColor="#000065" />
    </asp:GridView>

【问题讨论】:

  • 粘贴 Gridview 的标记。
  • @ChrisL 添加了网格视图
  • 您的复选框是否以编程方式添加?
  • @ChrisL 在行数据绑定中是。

标签: c# asp.net gridview checkbox webforms


【解决方案1】:

如果您以编程方式添加复选框,则需要在 pageinit 中的每个页面加载时(在 page_load 之前)重新添加它们。这样,控件会在每次回发时添加,并将从视图状态中填充它们的值。

更简单的方法是在定义中的模板字段中实际添加复选框

       <asp:TemplateField>
            <ItemTemplate>
                <asp:CheckBox runat="server" ID="chkC" />
            </ItemTemplate>
            <EditItemTemplate>
                <asp:CheckBox runat="server" ID="chkC" />
            </EditItemTemplate>
        </asp:TemplateField>

【讨论】:

  • 在这种情况下我能够做到这一点,但如果我必须动态创建控件,知道如何解决这个问题会很有趣。
  • Page_Init 函数是您必须在 page_load 之前动态添加控件的地方,否则视图状态不会将值加载回动态创建的控件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多