2014-12-05 66 views
4

我正在设置一个gridview,以便我可以选择多个事件并将它们的EventID添加到以逗号分隔的字符串中。这将是一个订阅服务,所以我需要知道用户想要订阅哪些事件。FindControl找不到控件

我使用了一个模板字段来添加一个复选框,我可以用它作为我想要的事件项目的指示器。

所以在GridView看起来像这样

<asp:GridView ID="GridView1" 
    runat="server" 
    AllowPaging="True" 
    AllowSorting="True" 
    AutoGenerateColumns="False" 
    DataSourceID="SqlDataSource1" 
    PageSize="15" 
    ViewStateMode="Enabled" SelectedRowStyle-BackColor="Purple"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:CheckBox ID="eventSelected" runat="server" /> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="EventID" HeaderText="EventID" InsertVisible="False" ReadOnly="True" SortExpression="EventID" /> 
     <asp:BoundField DataField="EventName" HeaderText="EventName" SortExpression="EventName" /> 
     <asp:BoundField DataField="BaseTypeKey" HeaderText="BaseTypeKey" SortExpression="BaseTypeKey" /> 
     <asp:BoundField DataField="BaseTypeDesc" HeaderText="BaseTypeDesc" ReadOnly="True" SortExpression="BaseTypeDesc" /> 

    </Columns> 
</asp:GridView> 

和信息填充相当不错。

我的代码检索选定的项目应该是简单的,但尚未运作。

private string GetCheckedEvents() 
{ 
    List<string> outputString = new List<string>(); 
    foreach (GridViewRow row in GridView1.Rows) 
    { 
     CheckBox cb = (CheckBox)row.FindControl("eventSelected"); 
     if (cb != null && cb.Checked) 
     { 
      outputString.Add(row.FindControl("EventID").ToString()); 
     } 
    } 
    return string.Join(",", outputString); 
} 

虽然调试代码时,该复选框是否设置正确,并进入if语句,但随后打的一行代码,并与

类型的异常“System.NullReferenceException出现“发生在EventEmailerConfiguration.dll但在用户代码

没有处理试图导航内由调试器给出的对象资源管理器是一个PITA,至少可以说。

我没有穿过正确的位置?

如何提取我需要的信息?

+0

什么时候'GetCheckedEvents()'被调用? – 2014-12-05 20:33:29

+0

[Return Gridview复选框布尔]可能的重复(http://stackoverflow.com/questions/15186546/return-gridview-checkbox-boolean) – MethodMan 2014-12-05 20:39:20

+0

@DennisR在一个按钮点击事件 – Malachi 2014-12-05 21:37:47

回答

4

您找不到BoundField,因为它不是一个真正的控件。你必须使用row.Cells[index].Text

outputString.Add(row.Cells[1].Text); 
1

蒂姆的建议应该工作,但如果EventID是你要绑定到GridView数据集的主键,那么你可以使用在GridView的DataKeyNames属性来存储关键价值和访问你需要的地方。然后你GetCheckedEvents()功能将成为,

private string GetCheckedEvents() 
    { 
     List<string> outputString = new List<string>(); 
     foreach (GridViewRow row in GridView1.Rows) 
     { 
      if (row.RowType == DataControlRowType.DataRow) 
      { 
       CheckBox cb = (CheckBox)row.FindControl("eventSelected"); 
       if (cb != null && cb.Checked) 
       { 
        long eventID= long.Parse(GridView1.DataKeys[row.RowIndex].Values["EventID"].ToString()); 
        outputString.Add(eventID); 
       } 
      } 
     } 
     return string.Join(",", outputString); 
    } 

和GridView控件定义

<asp:GridView .... DataKeyNames = "EventID" ... </asp:GridView> 
相关问题