2017-01-02 13 views
0

Contextは古いASP 2.0アプリケーションです。DBレコードIDをGridView行(ASP GridView)に正しくバインドするにはどうすればよいですか?

私は世界的に正常に動作するGridViewを持っている:

<asp:GridView ID="GV" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="DS" AllowPaging="true"> 
    ... 
    <asp:TemplateField HeaderText="MyFieldName" >      
     <ItemTemplate> 
      <asp:CheckBox ID="CB_ID" runat="server" OnCheckedChanged="CB_CheckedChanged" AutoPostBack="true" /> 
     </ItemTemplate> 
     <EditItemTemplate> 
      <asp:CheckBox ID="CB_ID" runat="server" OnCheckedChanged="CB_CheckedChanged" AutoPostBack="true" /> 
     </EditItemTemplate>     
    </asp:TemplateField> 
    ... 
</GridView> 

protected void CB_radio_obligatoire_CheckedChanged(object sender, EventArgs e) 
{ 
    CheckBox checkbox = sender as CheckBox; 
} 

だから、すべてのGridViewの行は、DBの項目を表します。 CB_radio_obligatoire_CheckedChangedメソッドはstoredProcedureを呼び出す必要があり、DBレコードIDが必要です。

このレコードIDをこのGridviewに設定してアクセスするにはどうすればよいですか?

最も簡単な方法は、IDにバインドされた隠しフィールドを設定することです。 もしそうなら、この隠されたフィールドはどこに置かれるべきですか? GridViewの隠しコラムとして? ASPの内部:TemplateField? ItemTemplateの内部?

答えて

1

ローインデックスを知っている場合は、DataKeyNamesの値にGridViewRowにアクセスできます。

protected void CB_ID_CheckedChanged(object sender, EventArgs e) 
{ 
    //cast the sender back to the checkbox 
    CheckBox cb = sender as CheckBox; 

    //cast the namingcontainer of the checkbox back to a gridviewrow 
    GridViewRow row = cb.NamingContainer as GridViewRow; 

    //as one-liner 
    GridViewRow row = (GridViewRow)((CheckBox)sender).NamingContainer; 

    //get the datakeyname value from the correct row in the gridview 
    int id = (int)GV.DataKeys[row.RowIndex]["Id"];  
} 
+0

Thx a ton VDWWD。 あなたは2日で2回私を助けました:)とても感謝しています! –

+0

ようこそ。 – VDWWD

関連する問題