【问题标题】:Getting data from a checkbox inside a template column of asp.net gridview从 asp.net gridview 模板列中的复选框获取数据
【发布时间】:2008-11-20 15:13:38
【问题描述】:

这似乎很简单,但我似乎无法弄清楚!我试图让 2-way 数据绑定在 ASP.net 页面上工作,其中一个复选框作为列之一。如何从 gridview 中获取更新的值(来自复选框)?????

这是我的数据类型:

[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();      
    }

最终,我会调用这样的东西,但我不知道它应该去哪里或如何从 gridview 中取回值:

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

【问题讨论】:

    标签: asp.net data-binding gridview


    【解决方案1】:

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

            if (chkBx != null && chkBx.Checked)
            {
                 /// put your code here
            }
        }
    

    【讨论】:

      【解决方案2】:

      尝试这样的事情来获得改变的价值:

      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') %>" />
      

      然后在回发时,遍历 UserRequirements 列表中的项目,将对象/项目 Id 与网格中复选框的 Id 匹配.. 像这样:

              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 以选择您要查找的复选框。

      【讨论】:

      • 我认为这种方式效果最好。如果您希望值在检查后立即更新,请记住将复选框的 AutoPostBack 属性设置为“True”。
      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2017-10-02
      • 2020-03-08
      • 1970-01-01
      • 2017-05-18
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多