asp.net 列标题中的复选框控件

js81xvg6  于 2023-11-20  发布在  .NET
关注(0)|答案(2)|浏览(109)

我在VS 2019中创建了一个应用程序aps.net c#
我有一个网格视图,在列标题中有一个复选框。一旦用户点击了一个单独的按钮来显示,我想验证列标题中的复选框“chkALL”,看看它是否被选中。我似乎无法获得正确的语法来做到这一点。请提供任何建议?
我的ASPX代码在这里:<asp:TemplateField HeaderText="Chg"><asp:CheckBox ID="ChkAll" runat="server" AutoPostBack="true" OnCheckedChanged="ChkAll_CheckedChanged" /><asp:CheckBox ID="ChkRow" runat="server" AutoPostBack="true" OnCheckedChanged="ChkRow_CheckedChanged" RowIndex="<%# Container.DataItemIndex %>" /></asp:TemplateField>
这是我尝试过的C#代码
CheckBox chkbox =(CheckBox)tgvCorrelations.Column[13].FindControl(“chkAll”);

vyswwuz2

vyswwuz21#

获取/使用和享受标题中复选框的价值?
可以对GridView. HeaderRow使用查找控件。
所以,假设这个标记:

<asp:Button ID="cmdLoad" runat="server" Text="Load Data"
    CssClass="btn"
    OnClick="cmdLoad_Click"
    />
<br />
<br />

<asp:GridView ID="GVHotels" runat="server" AutoGenerateColumns="False"
    DataKeyNames="ID" CssClass="table" 
    Width="45%"
    ShowHeaderWhenEmpty="true"
    >
    <Columns>
        <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
        <asp:BoundField DataField="LastName" HeaderText="LastName" />
        <asp:BoundField DataField="City" HeaderText="City" />
        <asp:BoundField DataField="HotelName" HeaderText="HotelName" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        <asp:TemplateField 
            ItemStyle-HorizontalAlign="Center"
            HeaderStyle-HorizontalAlign="Center"
            >
            <ItemTemplate>
                <asp:CheckBox ID="chkSel" runat="server" 
                    OnCheckedChanged="chkSel_CheckedChanged"
                    AutoPostBack="true"
                    />
            </ItemTemplate>
            <HeaderTemplate>
                <div style="text-align:center">
                    Select All<br />
                <asp:CheckBox ID="chkSelAll" runat="server"
                    OnCheckedChanged="chkSelAll_CheckedChanged"
                    AutoPostBack="true"
                    />
                </div>
            </HeaderTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

字符串
因此,当我们点击按钮加载GridView时,我们将获得标题中复选框的值,并将所有行设置为选中(或未选中)。
所以,加载网格的代码看起来像这样:

protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void cmdLoad_Click(object sender, EventArgs e)
    {
        LoadGrid();
    }

    void LoadGrid()
    {

        CheckBox chkSelAll = new CheckBox();
        chkSelAll.Checked = false;
        bool HoldCheck = false;
        if (GVHotels.Rows.Count > 0)
        {
            chkSelAll = (CheckBox)GVHotels.HeaderRow.FindControl("chkSelAll");
            HoldCheck = chkSelAll.Checked; 
        }

        string strSQL = @"SELECT * FROM tblHotelsA
                          ORDER BY HotelName";

        GVHotels.DataSource = General.MyRst(strSQL);
        GVHotels.DataBind();

        chkSelAll = (CheckBox)GVHotels.HeaderRow.FindControl("chkSelAll");
        chkSelAll.Checked = HoldCheck;  

        CheckAll(chkSelAll.Checked);
    }

    protected void chkSel_CheckedChanged(object sender, EventArgs e)
    {

    }

    protected void chkSelAll_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox chkSelAll = (CheckBox)sender;
        CheckAll(chkSelAll.Checked);
    }

    void CheckAll(bool chk)
    {
        // check/un check all check box for each row

        foreach (GridViewRow gRow in GVHotels.Rows)
        {
            CheckBox chkSel = (CheckBox)gRow.FindControl("chkSel");
            chkSel.Checked = chk;
        }
    }


注意非常接近,当我们重新绑定GridView时,复选框的设置丢失。所以,如果我们重新绑定GridView,但也尊重复选框,那么我们获取/抓取/保存复选框,重新加载网格,然后将复选框重新设置回标题。(当我们重新绑定时,值为LOST,因此上面的代码考虑到了这一点)。
请注意,在网格加载后,您可能仍然希望通过单击标题来选中所有(或取消选中所有)。该代码稍微简单一些,因为我们可以使用“sender”来获取所讨论的复选框。
因此,该代码是:

protected void chkSelAll_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox chkSelAll = (CheckBox)sender;
        CheckAll(chkSelAll.Checked);
    }


然而,上面的代码存根会并且可以使用GridView头对象的.FindControl,但是使用sender是更少的代码。
结果是这样的:
x1c 0d1x的数据

vngu2lb8

vngu2lb82#

您需要创建一个函数,以便在触发复选框的事件更改时使用
所以这个void写着:

private void  ChkAll_CheckedChanged(object sender, EventArgs e)
    {
    
        for (int i = 0; i < tgvCorrelations.Rows.Count; i++)  
            {  
                CheckBox chk = 
                 (CheckBox)tgvCorrelations.Rows[i].Cells[0].FindControl("chkAll");  
                if (chk.Checked)  
                {
    
                }
                else
                {
                    //...
                }
            }
    }

字符串

相关问题