访问列标题中的复选框控件

Accessing Check box control that is in column header

提问人:Rusty 提问时间:11/15/2023 更新时间:11/15/2023 访问量:32

问:

我在VS2019中创建了一个 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# 代码

复选框 chkbox = (CheckBox)tgvCorrelations.Column[13]。查找控件(“chkAll”);

C# asp.net GridView

评论


答:

0赞 Yahai Alnuimi 11/15/2023 #1

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

所以这个空白它写道:

 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
                {
                    //...
                }
            }
    }
0赞 Albert D. Kallal 11/15/2023 #2

获取/使用并享受标题中复选框的值?

可以对 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 的代码较少。

因此,结果是这样的:

enter image description here