【问题标题】:deleting row a given row index after sorting c#排序后删除行给定的行索引c#
【发布时间】:2012-03-09 06:25:46
【问题描述】:

我使用 bindnig 源构建我的数据网格:

    SqlDataAdapter adapter = new SqlDataAdapter(Datenbank.cmd);
    dataSet1.Tables.Clear();
    adapter.Fill(dataSet1, "Table");
    bs = new BindingSource();
    bs.DataSource = dataSet1.Tables["Table"];
    dataGridView1.DataSource = bs;

现在我对网格进行排序

    bs.Sort = "customer DESC";

现在我想删除第 0 行

    dataSet1.Tables[0].Rows.RemoveAt(0);

但是,排序前位于位置 0 的行将被删除,而不是现在位于位置 0 的行

//编辑:test.Tables[0].Rows.InsertAt(newRow, 0); 有类似的吗?

【问题讨论】:

  • 使用绑定源排序不会对原始数据表进行排序,而是对其副本进行排序。你最好使用数据键而不是行索引来删除。
  • @BrianDriscoll 您能否更详细地解释一下如何使用数据键而不是行索引?

标签: c# visual-studio-2010 datagridview dataset


【解决方案1】:

为什么不直接使用绑定源删除它 例如

  bs.RemoveAt(0)

关于test.Tables[0].Rows.InsertAt(newRow, 0);

BindingSource.Insert(int, object)BindingSource.List.Insert(int, object) 看起来不错,但当源为 DataSet 时不支持。

这是因为 BindingSource.Insert 只是调用了基础列表上的 System.Collections.IList.Insert()。基础列表是一个 DataView。在 Dataview 上插入的实现是

private void System.Collections.IList.Insert(int index, object value)
{
    throw ExceptionBuilder.InsertExternalObject();
}

你可以通过

 System.Data.DataView dv = bs.List as DataView;
 System.Collections.IList list = dv;
 list.Insert(0,newRow); //BANG InsertExternalObject exception

【讨论】:

  • test.Tables[0].Rows.InsertAt(newRow, 0); 有类似的吗?
  • BindingSouce.Insert 接受一个整数和一个对象,所以是的,但我还没有测试过
  • 表示无法将外部对象添加到此列表中
  • 是的,我刚刚调查了一下。更新了我的答案
  • 是的,这会引发异常,但您知道如何在排序后将一行放入特定位置吗?我开始了新问题,也许你可以参考那里 -> link
【解决方案2】:

在绑定源上删除,而不是在数据集上

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2010-12-12
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2011-03-16
    • 2015-07-25
    相关资源
    最近更新 更多