2017-09-09 18 views
2

私はFindControlを使用して、私のGridViewから選択された行のテキスト値を取得しようとしていますが、FindControlは常にNULLとして返します空。/RowDataBoundイベントのコントロールがNULLとして返す検索

.ASPXコード:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="CID" DataSourceID="SqlDataSource1" OnRowDataBound="GridView1_RowDataBound"> 
    <Columns> 
     <asp:CommandField ShowSelectButton="True" /> 
     <asp:BoundField DataField="CID" HeaderText="CID" InsertVisible="False" ReadOnly="True" SortExpression="CID" /> 
     <asp:BoundField DataField="CountryID" HeaderText="CountryID" SortExpression="CountryID" /> 
     <asp:TemplateField HeaderText="CountryName" SortExpression="CountryName"> 
      <EditItemTemplate> 
       <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("CountryName") %>'></asp:TextBox> 
      </EditItemTemplate> 
      <ItemTemplate> 
       <asp:Label ID="Label1" runat="server" Text='<%# Bind("CountryName") %>'></asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

C#コード:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     TextBox txt = e.Row.FindControl("TextBox1") as TextBox; 
     string name = txt.Text; // returns as NULL 
    } 
} 

は、誰もがここで私が間違っているのかを指し示すことができるか、これを行う他の方法はありますか?選択ボタンをクリックしたとき、上記のGridViewからCountryNameの値を取得したかったのです。あなたは次のように選択ボタンのクリックから値を取得するためにOnRowCommandイベントを使用することができます

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    // check if its not a header or footer row 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // check if its in a EditTemplate 
     if (e.Row.RowState == DataControlRowState.Edit) 
     { 
      TextBox txt = e.Row.FindControl("TextBox1") as TextBox; 
      string name = txt.Text; 
     } 
    } 
} 

OR

:あなたはGridViewののEditTemplateモードからの制御を見つける/確認する必要がコメント上記@AlexKurryashevよう

+2

'ID =" TextBox1 "でのコントロールは' EditItemTemplate'のみにあります。 'e.Row.RowState == DataControlRowState.Edit'を試してください。あるいは 'TextBox'と' Label'に同じIDを与えます。 –

答えて

1

protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) 
{ 
    if (e.CommandName == "Select") 
    { 
     // get row where clicked 
     GridViewRow row = (GridViewRow)(((Button)e.CommandSource).NamingContainer); 

     Label txt = row.FindControl("Label1") as Label; 
     string name = txt.Text; 
    } 
} 
1

ありがとうございます!私は "ItemTemplate"からデータを取得することができました。しかし今回は別のイベントを使いました。

protected void GridView1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     { 
      Label txt = GridView1.SelectedRow.FindControl("Label1") as Label; 
      string name = txt.Text; 
      Label2.Text = name; 

      Session["Name"] = name; 
      Response.Redirect("check.aspx"); 
     } 
    } 
関連する問題