【问题标题】:Delete a row from Datagrid view and also from object in windows forms从 Datagrid 视图和 Windows 窗体中的对象中删除一行
【发布时间】:2014-03-08 02:32:32
【问题描述】:

我有一个带有 datagridview 的表单,该表单从另一个类中的对象填充(基本上这个对象在整个应用程序中就像一个数据库)。当用户单击按钮时,选定的行将被删除。该行应从 dgv 以及该对象中删除。

还有一个搜索条件可以减少 dgv 中显示的行数。现在,当用户选择此搜索并从减少的行数中选择一行时,我无法处理删除行逻辑。

目前我在 INT 变量中拥有行号并在对象列表中删除相同的实例。我知道当行数减少时这将不起作用。在此先感谢您的帮助。

形式:

private void btnDelete_Click(object sender, EventArgs e)
{
class obj=new class();
int row = dataGridView1.CurrentCell.RowIndex;
obj.deleteName(row);
dataGridView1.Rows.RemoveAt(row);
}

在课堂上:

class Class
{
List<string> names=new list<string>();

public void deleteName(int index)
{
names.RemoveAt(index);
}

}

【问题讨论】:

  • 实际上它们填充了另一个类对象的列表。两个类 A 和 B,其中 B 具有 A 列表。在表单中,我填充了 B 的对象列表(这是 A 的集合)。

标签: c# winforms


【解决方案1】:

以下是一些建议,尽可能多地使用您当前的代码。

创建一个自定义类来填充DataGridView

public class MyData
{
    public int ID { get; set; }
    public string Name { get; set; }
    ...
}

然后您可以使用以下命令从网格中访问当前项目:

var currentRow = (MyData)dataGridView1.CurrentRow.DataBoundItem;

obj.DeleteRecord(currentRow);

并在从集合中删除时使用该记录:

class Class
{
    List<MyData> records = new List<MyData>();

    public void DeleteRecord(MyData record)
    {
        records.Remove(record);
    }
}

【讨论】:

    【解决方案2】:

    那么,如果我理解正确,您是在视觉上删除它,而不是在源列表中?我这样做的方式是将其作为System.Collections.ObjectModel.ObservableCollection&lt;T&gt; 并对其执行所有添加/删除操作。您的视图将与列表同步,因为 ObservableCollection 报告了更改。

    【讨论】:

      【解决方案3】:

      您可以使用string 本身在您的类Class 的绑定列表中搜索,而不是删除基于Index 的对象,如下所示:

      class Class
      {
          List<string> names=new list<string>();
      
          public void deleteName(string name)
          {
              names.Remove(names.Single(x => x == name));
          }
      }
      

      然后您可以使用更新的names 列表重新绑定 DataGridView。

      【讨论】:

      • 感谢您的回复。我试过这个。当有 2 个同名字符串时会发生什么?
      • 那么我建议你维护另一个 Id 的隐藏列,比如应该唯一指向每一行的类型。所以在btnDelete_Click,为current 行选取Id 列的值,并在Class 类中删除相同的值。但是,您还应该在映射到每个字符串的 List 中维护另一个 Id 字段。
      • 是否可以在DGV中维护一些索引而不影响类。例如,有 7 行,dgv 中的索引是从 0 到 6。在搜索期间,选择第 1 行和第 5 行。仍然在 dgv 中,行的索引应该是 1 和 5 而不是 1,2。是否可以 ?非常感谢您的回复
      • AFAIK,WinForms DGV 不支持此功能。所以,很遗憾你不得不采用可能的方式。
      • 我按照你的建议做了。它不起作用。这就是我所做的:code for (int i = 0; i
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多