如何通过ID操作itemtemplate中的项目

时间:2013-08-14 17:06:36

标签: c# asp.net webforms

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

这是一个链接http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.templatefield.itemtemplate.aspx

我认为这与直接访问代码隐藏或服务器脚本中的任何其他控件一样简单,但它不起作用。当我尝试通过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>

最初,我曾尝试在代码隐藏中访问ID。但即使尝试使用服务器脚本,它仍然无法找到它。 如果不是ID,我该如何访问复选框?

修改:这有效=)

    protected void checkall_CheckedChanged(object sender, EventArgs e)
    {
        //get whether its checked or not.
        CheckBox theCheckBox = sender as CheckBox;      

        //check them all if checked. Uncheck them all when unchecked.
        if (theCheckBox.Checked)
        {
            foreach (GridViewRow row in ApplicationsGridView.Rows)
            {

                CheckBox cb = row.FindControl("checkboxes") as CheckBox;
                cb.Checked = true;
            }
        }

        else if (!(theCheckBox.Checked))
        {
            foreach (GridViewRow row in ApplicationsGridView.Rows)
            {

                CheckBox cb = row.FindControl("checkboxes") as CheckBox;
                cb.Checked = false;
            }

        }
    }

2 个答案:

答案 0 :(得分:1)

如果你想在客户端这样做(通常你会想要一个检查框来检查所有方框),你需要在页面生命周期的渲染时从控件中获取ClientID。

在4.0之前你可以&#34;作弊&#34;并查看呈现的页面(从浏览器查看源代码)。但是,这是一种脆弱的方法,因为它可能会随着.aspx页面的每次编辑而改变。

如果您拥有最新的框架(4.0或更高版本),则可以将ClientIDMode设置为静态。然后,您将能够使用ID属性中的值作为ClientID。

http://msdn.microsoft.com/en-us/library/1d04y8ss%28v=vs.100%29.aspx

答案 1 :(得分:1)

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

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;
        }
    }
}