C# 如何按ID操作itemtemplate中的项目

C# 如何按ID操作itemtemplate中的项目,c#,asp.net,webforms,C#,Asp.net,Webforms,现在我查看了ItemTemplates上的MSDN,但没有看到如何通过ID访问它们 这里有一个链接 我认为这将是直接的,就像访问codebehind或服务器脚本中的任何其他控件一样,但它不起作用。当我试图通过ID引用它时,我一直得到当前上下文中不存在的错误 我试图做的是访问标题checbox的checked属性,并使用该属性选择或取消选择ItemTemplate中的所有复选框。我还需要知道它们以后是否被选中用于代码中的其他用途 下面是我在项目中使用的gridview的代码 <asp:Gri

现在我查看了ItemTemplates上的MSDN,但没有看到如何通过ID访问它们

这里有一个链接

我认为这将是直接的,就像访问codebehind或服务器脚本中的任何其他控件一样,但它不起作用。当我试图通过ID引用它时,我一直得到当前上下文中不存在的错误

我试图做的是访问标题checbox的checked属性,并使用该属性选择或取消选择ItemTemplate中的所有复选框。我还需要知道它们以后是否被选中用于代码中的其他用途

下面是我在项目中使用的gridview的代码

<asp:GridView ID="ApplicationsGridView" runat="server"
   AutoGenerateColumns="True"
   visible="true"
   Font-Size="Smaller"
   CellPadding="5"
   Width="1200px"
   BorderStyle="Solid"
   BorderColor="Black"
   OnDataBinding="ApplicationsGridView_DataBinding">
<%-- Add the checkboxes declaratively  --%>
<Columns>
  <asp:TemplateField>
    <HeaderTemplate>
      <asp:CheckBox runat="server" ID="checkall" Checked="true" OnCheckedChanged="checkall_CheckedChanged" />
      <script runat="server">
        protected void checkall_CheckedChanged(object sender, EventArgs e)
        {
          if(checkall.checked)
          {
            foreach (GridViewRow row in ApplicationsGridView.Rows { }
          }         
        }
      </script>
    </HeaderTemplate>
    <ItemTemplate>
      <asp:CheckBox runat="server" ID="checkboxes" Checked="true" />
    </ItemTemplate>
  </asp:TemplateField>
</Columns>
<AlternatingRowStyle BackColor="#d2d2f2" />
<HeaderStyle Font-Bold="true" BackColor="#052a9f"  ForeColor="#eeeeff"  Font-Size="Medium"/>
</asp:GridView>

如果希望在客户端执行此操作(通常是这样),则用户希望在页面生命周期中的呈现时使用复选框来选中控件中需要ClientID的所有框

在4.0之前的版本中,您可以作弊并从浏览器查看呈现的页面视图源。然而,这是一种脆弱的方法,因为它可能会随着.aspx页面的每次编辑而改变

如果您使用的是最新的framework 4.0或更高版本,则可以将ClientIDMode设置为Static。然后您将能够使用ID属性中的值作为ClientID


在网格中的所有行中循环时,需要检查行的类型,如下所示:

foreach (GridViewRow row in ApplicationsGridView.Rows)
{
    if(row.RowType == DataControlRowType.Header)
    {
        // Search for checkbox by ID here
        CheckBox theCheckBox = row.FindControl("checkall") as CheckBox;

        // Do whatever you need to do with checkbox here
    }
}
更新:

您不需要搜索实际控件,因为复选框启动了事件,所以您可以执行以下操作:

protected void checkall_CheckedChanged(object sender, EventArgs e)
{
    // Cast the sender of the event to a check box, because the check box created this event
    CheckBox theCheckBox = sender as CheckBox;

    if (theCheckBox.Checked)
    {
        foreach (GridViewRow row in ApplicationsGridView.Rows)
        {   
            // Here is where you want to search for the existing check boxes, not create new ones
            CheckBox cb = row.FindControl("checkboxes") as CheckBox;
            cb.Checked = true;
        }
    }
}

我想我想理解的是为什么我可以有一个带有ID的标签,并且可以很好地访问它。但模板中的任何内容我都不能。据我所知,所有id本质上都是服务器端,id本质上是客户端。此外,如果没有服务器端id,我无法以编程方式获取某个对象的客户端id。例如,字符串x=ApplicationsGridView.ClientID.ToString;使用Version4+和ClientMode,您可以,但是看看Karl的答案,他解释了服务器端需要什么。非常感谢你。从Java转换到C/Asp.net是一个漫长的过程。我一直在学习“as”之类的东西。再次感谢您的帮助。嘿,我不想打听,但当我在调试中运行代码时,它从未找到该复选框。我正在根据您发布的新代码更新我的答案。请参阅更新。我将尝试一下。
protected void checkall_CheckedChanged(object sender, EventArgs e)
{
    // Cast the sender of the event to a check box, because the check box created this event
    CheckBox theCheckBox = sender as CheckBox;

    if (theCheckBox.Checked)
    {
        foreach (GridViewRow row in ApplicationsGridView.Rows)
        {   
            // Here is where you want to search for the existing check boxes, not create new ones
            CheckBox cb = row.FindControl("checkboxes") as CheckBox;
            cb.Checked = true;
        }
    }
}