【发布时间】:2015-06-11 06:20:33
【问题描述】:
我正在尝试根据用户偏好对数据集中的记录进行排序。我添加了一个按钮(向上移动)将所选记录向上提升 1 行,这就是我到目前为止所做的:
private void btnMoveUp_Click(object sender, EventArgs e)
{
int index = dataGridView1.CurrentRow.Index;
if (index >= 1)
{
var temp = dsWinners.Tables[0].Rows[index];
dsWinners.Tables[0].Rows[index].Delete();
dsWinners.Tables[0].Rows.InsertAt(temp, index - 1);
dsWinners.Tables[0].AcceptChanges();
dataGridView1.DataSource = dsWinners.Tables[0];
}
}
但我收到一条错误消息,提示“此行已属于此表。”在这一行:
dsWinners.Tables[0].Rows.InsertAt(temp, index - 1);
我知道我必须使用 ImportRow(temp) 而不是 InsertAt(temp, index - 1) 但问题是我不知道如何在正确的位置导入它。我已经看过THIS,但正如回答问题的人所说“它草率且半途而废。”
无论如何我可以克服这个问题吗?如果是,我该怎么做?
【问题讨论】:
-
尝试在删除之后和插入之前调用 AcceptChanges 以及您已经拥有的一个
-
另一种方法是在表中添加一个位置列(如果还没有),并在开头使用位置 (1 ... n) 对其进行初始化。按此列对视图进行排序。当用户想要更改位置时,您只需将单元格的值交换为两行并断言视图仍按此列排序。
-
@Adil 我添加了 AcceptChanges();删除后和插入后。它删除了该行,在其顶部添加了一个新行,但它是空的!!!可能是因为 temp 为空还是只是没有将其内容添加到新行?
-
@Markus 我没有它,因为该表没有从数据库中提取...它是从 excel 生成的表单和二维数组的组合。但是我可以添加该列并将其隐藏吗?比如我可以让可见的为假吗?
-
我认为@Markus 方法更好。您是否尝试过在方法中交换 Delete 和 InsertAt 行并测试结果?
标签: c# winforms datagridview dataset