2014-12-05 67 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> 
相關問題