GridViewでDataKeyNameを使用してデータキー値を格納

2501 ワード

GridViewのRowCommandのようなイベントでは、現在のローの関連データ値を取得する必要がある場合が多い.しかし、これらのデータ値はGridViewの列に直接反映されていません.この時はどうすればいいですか?ある学生は列を隠す方法で、使用する必要があるが表示しないフィールドをこの列にバインドするのが好きで、同時に列の幅を0に設定するか、表示しないかを設定して、使用する時に通常の行のある列を取る方法でデータを取得することができます.しかし、Framework 2.0では、このようなデータを取得するためにDataKeyNamesを使用することができます.コード例:(フロント)
<asp:GridView ID="GridView1" runat="server" DataKeyNames="Grup" OnRowCommand="GridView1_RowCommand" AutoGenerateColumns="False">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" Text='<%#Eval("GrupName") %>'></asp:Label>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:ButtonField Text="  " />
            </Columns>
        </asp:GridView>

Grup
表示する必要はありませんが、使用したい列です.(複数のフィールドがある場合はカンマで区切る)
(バックグラウンド)
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack )
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Grup");
            dt.Columns.Add("GrupName");

            dt.Rows.Add(new object[] { 0,"   " });
            dt.Rows.Add(new object[] { 1,"   " });

            this.GridView1.DataSource = dt;
            this.GridView1.DataBind();
        }

    }

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        //         
        int index = Convert.ToInt32(e.CommandArgument);

        //                
        string strGrup = ((GridView)sender).DataKeys[index].Values["Grup"].ToString();  
    }

ついでに補足します.
テンプレート列にボタンコントロールを配置する方法を使用すると、ボタンイベントでこのフィールド値を取得するのは簡単です. 
ボタンのCommandArgumentプロパティをバインドしたいフィールドに設定するには、次のようにします.
<asp:TemplateField> 
     <ItemTemplate> 
         <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Button" CommandArgument=' <%#Eval("Grup") %>' /> 
     </ItemTemplate> 
</asp:TemplateField> 

ボタンイベントの書き込み:
protected void Button2_Click(object sender, EventArgs e) 
{ 
    string strGrup = ((Button)sender).CommandArgument.ToString(); 
}