2

これは簡単なことのように思えますが、理解できないようです。列の 1 つとしてチェック ボックスを使用して、ASP.net ページで双方向のデータ バインディングを機能させようとしています。グリッドビューから (チェック ボックスから) 更新された値を取得するにはどうすればよいですか?????

ここに私のデータ型があります:

[Serializable]
public class UserRequirements 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserId { get; set; }
    public string Email { get; set; }

    public bool ThingRequired { get; set; }
}

私のマークアップは次のようになります。

<form id="form1" method="post" runat="server" >
    <asp:GridView ID="UserTable" runat="server" AutoGenerateColumns="false" >
    <Columns>
        ...
        <asp:TemplateField HeaderText="Required ?">
            <ItemTemplate>
                <asp:CheckBox id="chkBox1" runat="server"  on
                Text ="Required"
                checked='<%# DataBinder.Eval(Container.DataItem,"ThingRequired")  %>'>
                </asp:CheckBox>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
    </asp:GridView>
    <asp:Button id="thebutton" Text="Save Changes" OnClick="UpdateRequirements" runat="server"  CausesValidation=false  />  
</form>

私のコードビハインドは次のようになります。

    List<UserRequirements > _userList = new List<UserRequirements >();

    protected void Page_Load(object sender, EventArgs e)
    {
        _userList = data_layer.GetUserRequirments();


        this.UserTable.DataSource = _userList;
        this.UserTable.DataBind();      
    }

最終的に、私はこのようなものを呼び出しますが、これがどこに行くべきか、グリッドビューから値を取り戻す方法がわかりません:

void UpdateRequirements(object sender, EventArgs e)
{
    _userList = ???????????? // How do I get the data?
    data_layer.UpdateUserRequirements( _userList );
} 
4

2 に答える 2

2

foreach (GridViewRow di in GridView1.Rows) { HtmlInputCheckBox chkBx = (HtmlInputCheckBox)di.FindControl("chkBox1");

        if (chkBx != null && chkBx.Checked)
        {
             /// put your code here
        }
    }
于 2008-11-20T15:20:21.350 に答える
1

変更時に値を取得するには、次のようなことを試してください。

protected void OnCheckedChanged(object sender, EventArgs e)
{    
   CheckBox c = (CheckBox)sender as CheckBox;    
   string checkBoxId = c.ID;    
   bool checkBoxValue = c.Checked;
   //update database
}

[編集]

一度にグリッド内の行からすべての値を取得したい場合は、UserRequirements のリスト内の行または項目の Id を使用してチェックボックスをバインドする必要があるため、グリッドで次のようにします。

<asp:CheckBox ID="<%# Eval('Id') %>" />

次に、ポストバック時に、オブジェクト/アイテム ID とグリッド内のチェックボックスの ID が一致する UserRequirements リスト内のアイテムを反復処理します。次のようになります。

        foreach (UserRequirement item in Requirements)
        {
            Control c = grid.FindControl(item.Id);
            CheckBox cbx = c as CheckBox;
            if (cbx != null)
            {
                bool value = cbx.Checked;
                //update db
            }
        }

注: FindControl を再帰的に使用して子コントロールを検索するか、グリッド内の各 GridViewRow オブジェクトに対して foreach を実行して、探しているチェックボックスを選択する必要がある場合があります。

于 2008-11-20T15:27:50.947 に答える