通过按钮更新datagridview行

时间:2018-12-07 03:55:34

标签: c# winforms datagridview

我有一个DataGridView,其中有一个复选框列。我想做的是,通过单击按钮,通过从那些行(id)获取某些列数据来更新那些选中了复选框的行,并将其发送给我拥有的update sql命令。 首先,我用数据表填充datagridview,然后创建一个具有readonly属性为false的复选框列,以便可以单击它。 然后从按钮的onclick事件中,执行以下操作:

private void AnularBoton_Click(object sender, EventArgs e)
    {
        foreach datagridview row in datagrid {
          if a certain column (checkbox) from that row is checked
          then get the id from that row (id is the first column)
        }
    }

我将这些ID保存在一个数组中,并立即更新它们。

3 个答案:

答案 0 :(得分:1)

我已阅读您的问题,请尝试下面的代码,下面的代码是选中复选框按钮列的值,然后选中行ID,然后尝试下面的代码

foreach(DataGridViewRow dgr in yourdatagridviewname.Rows)
{
    if(dgr.Cells["yourcheckboxcolumnName"].Value==True)
    {
        var id=Convert.ToInt32(dgr.Cells["youridfieldName"].Value.ToString())
    }
}

答案 1 :(得分:1)

将布尔列添加到数据表中,然后执行以下操作:

foreach(DataRow ro in YourDataTableNotYourDataGridView.Rows){
  if((bool)ro["BOOLEAN COLUMN NAME HERE"]){
    //do something
    int id = (int)ro["id"];

    //but if you're manipulating the data, just do it directly, don't collect the id
    ro["name"] = "John";

    //the only thing you can't do, is delete the row from the table, because your enumerating the table
    //if you want to do that, use a regular for loop (with an index int) in reverse order
  }
}

用户将使用DGV在相关行上打勾,从而在数据模型中设置布尔值,然后使用该值

您将注意力集中在datagridview上,就好像它包含数据*并应以编程方式进行操作并与之交互一样;不应该。 DGV纯粹是供用户用来查看和操纵数据模型的工具。您应该以编程方式访问和操作数据模型,而不是视图/控制器

*您说过“首先我要用数据填充DGV”-这不是正确的处理方式。 DGV是驻留在其他位置的数据视图,它不会直接填充任何数据本身,也不应该填充任何数据。 MVC理论的核心概念是模型,视图和控制器关注点保持分离。出于实用性考虑,V和C通常是同一件事,但M仍然是不同的

此外,如果您为此使用强类型数据集,那么您的工作将会变得轻松很多,而无需使用强制转换和字符串中的列名访问

foreach(TypedDataRow ro in typedDataTable){
  if(ro.BoolColumnName)
    //do something
}

当您涉及LINQ时,事情也会变得更加轻松和紧凑:

List<int> segurosId = datatable.Where(r => r.BoolColumn).Select(r => r.id).ToList();

该行代码与您的代码相同;

List<int> segurosID = new List<int>(); foreach (DataGridViewRow dc in SegurosDataGridView.Rows) { if (dc.Cells["Anular"].Value != null) { if ((Boolean)dc.Cells["Anular"].Value == true) { segurosID.Add(Convert.ToInt32(dc.Cells["Seguro"].Value)); } } }

最后一点;只是迭代数据表并直接更改数据;不要陷入迭代数据表,寻找布尔值,提取ID,使用这些ID来检索每一行,更改行的circuit回方法。如果您犯了翻翻错误的错误,则可能必须这样做datagridview就像是存储数据一样,但是此答案的关键概念是让您进入MVC并了解分离,以编程方式直接更改数据,并让用户通过Gridview以非编程方式更改数据。举个极端的类比,如果您正在编写更新数据库的程序,则只会更新数据库,而不会在计算机上安装Sql Server Management Studio,然后使用SendKeys来控制它并让它更新数据库。同样,您不应该通过与数据连接到的网格视图进行编程交互来着手处理数据表中的数据

答案 2 :(得分:0)

尝试下面的代码,这些代码将获取您的复选框列值并存储在数组中:

   foreach(DataGridViewRow dgr in DataGridview.Rows)
    {
       if(dgr .Cells["checkbox"].Value)==True)
       {
          int id=dgr.Cells["id"].Value);
        }              
    }

谢谢。