【问题标题】:Updating datagridview rows from a button从按钮更新 datagridview 行
【发布时间】:2018-12-07 03:55:34
【问题描述】:

我有一个 DataGridView,它有一个复选框列。我想要做的是,通过单击按钮,通过从这些行(id)获取某个列数据来更新复选框被选中的那些行,并将其发送到我拥有的更新 sql 命令。 首先,我使用数据表填充 datagridview,然后创建一个复选框列,其只读属性为 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 保存在一个数组中,然后一次性更新它们。

【问题讨论】:

  • 那么为什么你的代码不起作用?
  • 我想我很累找不到方法,但我做了一个类似于答案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)); } } }的方法

标签: c# winforms datagridview


【解决方案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&lt;int&gt; segurosID = new List&lt;int&gt;(); 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 检索每一行、更改行。如果你犯了翻找的错误,你可能必须这样做datagridview 好像它是数据的存储,但这个答案的关键概念是让您进入 MVC 并理解分离,直接以编程方式更改数据并让用户通过 gridview 以非编程方式更改数据。打个极端的比喻,如果你在写一个更新数据库的程序,你只会更新数据库,你不会在机器上安装 Sql Server management Studio,然后使用 SendKeys 来控制它并让它更新数据库。同样,您不应该通过以编程方式与数据所连接的网格视图交互来操作数据表中的数据

【讨论】:

  • 此答案基于DataGridView.DataSource 是提到的DataTable OP 的假设。但如果“手动”填充行将不起作用
  • 不太确定你的意思。 OP sais“首先我用数据表填充 datagridview 并且”.. 如果您的意思是他填充了一个数据表然后不是绑定网格,他使用循环将数据表数据添加到网格中然后 a) 应该更改, b) 它不会使这个建议无效,并且 c) 暗示他知道如何访问存储在 dgv 中的数据,从而解决整个问题。因此推断这是一个数据绑定表
【解决方案2】:

我已经阅读了您想要尝试以下代码的问题,下面的代码是选中复选框按钮列值,然后检查行 id 获取...尝试下面的代码

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

【讨论】:

  • dr.Cells["yourcheckboxcolumnName"].Value 的值已经是 bool 类型。只需转换它而不转换为字符串并返回布尔值。
  • 这个Datarow dr in yourdatagridviewname.Rows 甚至不应该编译。
  • @Fabio 此代码适用于我的表单我在我的表单中使用过这种类型的代码,它目前也适用于一个应用程序。
  • 我刚刚使用了 int id 变量,你想用数组替换它
  • DataGridView.RowsDataGridViewRow 而不是 DataRow 的集合 - 您的代码将无法编译。
【解决方案3】:

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

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

谢谢。

【讨论】:

  • 请说明这与发布的其他答案有何不同(这也使得 int->string->int 转换的同样毫无意义的讽刺)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 2013-07-07
相关资源
最近更新 更多