8

SQL データベースから DataSource をバインドする GridView があります。グリッドにはチェックボックスのある列があり、その中のいくつかの項目 (実際には行) を「選択」できます。ここで必要なのは、選択した各行のアイテムを更新することですが、いくつかの検索の後、行内のアイテムにアクセスする方法が見つかりません。DataItem は機能すると思いますが、Null が返されます。

編集:短くするために、DataSource から構築された GridView があるため、基本的に、各行はオブジェクトを表し、行の 1 つでチェックボックスをオンにすると、関連するオブジェクトを取得できるようにしたいその行、それを達成する最も簡単な方法は何ですか?

Page_Load の DataBinding:

  if (!Page.IsPostBack)
    {
        gvUnusedAccessories.DataSource = currentContext.Items.OfType<Accessory>().Where(ac => ac.Item_Parent_Id == ((PhoneLine)currentItem).Parent.Item_Id);
        gvUnusedAccessories.AutoGenerateColumns = false;
        gvUnusedAccessories.DataBind();
    }

更新ボタンを押したときのイベントは、実際に行を参照し、行にチェックボックスがある場合は更新を行います:

protected void btnAddToMobile_Click(object sender, EventArgs e)
{
    foreach (GridViewRow row in gvUnusedAccessories.Rows)
    {
        if(((CheckBox)row.FindControl("chkSelect")).Checked)
        {
            ((Accessory)row.DataItem).PhoneLine_Id = currentItem.Item_Id;
        }
    }
}

そして、これが .aspx の私の GridView です:

 <asp:GridView ID="gvUnusedAccessories" runat="server">
    <Columns>
        <asp:CommandField ShowSelectButton="True" />
        <asp:TemplateField HeaderText="Select">
            <ItemTemplate >
                <asp:CheckBox ID="chkSelect" runat="server" AutoPostBack="True"/>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="Item_Id" HeaderText="ID" ReadOnly="True"/>
        <asp:BoundField DataField="Item_Name" HeaderText="Name" ReadOnly="True"/>  
        <asp:BoundField DataField="AccessoryModel" HeaderText="Modèle" ReadOnly="True"/>
        <asp:BoundField DataField="AccessoryBrand" HeaderText="Marque" ReadOnly="True"/>
    </Columns>
</asp:GridView>

行内に含まれるオブジェクトにアクセスする方法に関するヒントはありますか? 実際に ID を取得してから DB に SQL リクエストを実行できることはわかっていますが、少し重いようで、より良い解決策が必要です。

4

2 に答える 2

4

データバインディングが完了すると、DataSource を ViewState またはセッションに格納しない限り、データ ソースが失われます。これを行わない限り、DataItem は常に null になります。このため、データ ソースをビュー ステートで保存していることに気付くことがよくあります。もちろん、これはページサイズが大きくなることを意味します。あなたが述べた他のオプションは、ある種の主キーでデータソースを再クエリすることです。ニーズによっては、どちらのオプションが優れているとは言えません。私は 2 回目の DB 呼び出しよりもビュー ステートに傾倒する傾向があります。

于 2012-07-31T19:34:41.260 に答える
3

チェックボックスを設定すると、行を更新する必要がありますAutoPostBackasp:checkbox

したがって、呼び出されたときにイベントを設定すると、選択した行のみを更新でき、グリッド全体を反復処理する必要がないことをお勧めOnCheckedChanged="chkStatus_OnCheckedChanged"asp:checkboxますchkSelect

選択したチェックボックスの行アイテムを取得する方法の例を次に示します

public void chkStatus_OnCheckedChanged(object sender, EventArgs e)
{
    CheckBox chkStatus = (CheckBox)sender;

    //now grab the row that you want to update
    GridViewRow row = (GridViewRow)chkStatus.NamingContainer;


    string cid = row.Cells[1].Text;
    bool status = chkStatus.Checked;

    //now you can do you sql update here
}
于 2012-07-27T20:14:04.560 に答える