更改数据集中记录的顺序
changing the order of records in dataset
我正在尝试根据用户偏好对数据集中的记录进行排序。我添加了一个按钮(向上移动)以将所选记录提高 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];
}
}
但是我在这一行收到一个错误提示 "This row already belongs to this table.":
dsWinners.Tables[0].Rows.InsertAt(temp, index - 1);
我知道我必须使用 ImportRow(temp) 而不是 InsertAt(temp, index - 1) 但问题是我不知道如何将它导入到正确的位置。我看过 THIS 但正如回答问题的人所说 "Its sloppy and halfway."
有没有办法解决这个问题?如果是,我该怎么做?
你可以再试一件事。尝试替换代码
var temp = dsWinners.Tables[0].Rows[index];
具有以下内容::
var temp = dsWinners.Tables[0].NewRow();
temp.ItemArray = dsWinners.Tables[0].ItemArray;
这是创建新行并将其移动到给定位置,而不是移动现有行。
尝试以下操作:
var temp = dsWinners.Tables[0].Rows[index]; \getting row
var newrow = dsWinners.Tables[0].NewRow(); \ creating new row to insert
newrow.ItemArray = temp.ItemArray; \ copying data from old to new row
dsWinners.Tables[0].Rows[index].Delete(); \deleting old row.
dsWinners.Tables[0].Rows.InsertAt(newrow, index - 1); \ adding new row.
您可以向包含该位置的 table 添加一列,而不是删除该行并在另一个位置再次添加它。
您不会将 DataGridView 绑定到 table 本身,而是绑定到按位置列排序的 DataView。
在 DataGridView 中,您将添加除 Position 之外的所有列,以便不显示 Position。
当您向上或向下移动一行时,位置单元格的值分别与上一行或下一行交换。由于DataView是按位置排序的,因此移动会立即反映在DataView中。
以下控制台应用程序显示了基本步骤:
void Main()
{
// Create a new DataTable
DataTable tbl = GetData();
// Add Position column and initialize it
tbl.Columns.Add("Position", typeof(int));
for(int i = 0; i < tbl.Rows.Count; i++)
tbl.Rows[i]["Position"] = i;
PrintView("Original", tbl.DefaultView);
// Create a view that is sorted by the Position column
var view = new DataView(tbl);
view.Sort = "Position";
PrintView("Sorted", view); // No change as the rows are in original order anyway
// Move a row
SwapPositions(view, 0, 1); // Move first row down
PrintView("Swapped", view);
}
private DataTable GetData()
{
DataTable tbl = new DataTable();
tbl.Columns.Add("Value", typeof(string));
for(int i = 0; i < 3; i++)
tbl.Rows.Add("Text " + i.ToString());
return tbl;
}
private void PrintView(string header, DataView view)
{
Console.WriteLine(header);
foreach(DataRowView row in view)
Console.WriteLine("{0}\t{1}", row["Position"], row["Value"]);
}
private void SwapPositions(DataView view, int rowIndex1, int rowIndex2)
{
// Save rows as the change in the Position column is reflected immediately
DataRowView row1 = view[rowIndex1];
DataRowView row2 = view[rowIndex2];
// Now swap positions
var saveValue = row1["Position"];
row1["Position"] = row2["Position"];
row2["Position"] = saveValue;
view.Table.AcceptChanges();
}
输出为:
Original
0 Text 0
1 Text 1
2 Text 2
Sorted
0 Text 0
1 Text 1
2 Text 2
Swapped
0 Text 1
1 Text 0
2 Text 2
这是最后一个索引 table 移动到数据集中的第一个索引:
DataSet dsIndexchange = new DataSet();
DataTable dtdummysummary = new DataTable();
dtdummysummary = dsAssetInterval.Tables[dsAssetInterval.Tables.Count-1];
dsAssetInterval.Tables.RemoveAt(dsAssetInterval.Tables.Count-1);
dsIndexchange.Tables.Add(dtdummysummary);
for (int i = 0; i < dsAssetInterval.Tables.Count; i++)
{
dsIndexchange.Tables.Add(dsAssetInterval.Tables[i].Copy());
}
我正在尝试根据用户偏好对数据集中的记录进行排序。我添加了一个按钮(向上移动)以将所选记录提高 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];
}
}
但是我在这一行收到一个错误提示 "This row already belongs to this table.":
dsWinners.Tables[0].Rows.InsertAt(temp, index - 1);
我知道我必须使用 ImportRow(temp) 而不是 InsertAt(temp, index - 1) 但问题是我不知道如何将它导入到正确的位置。我看过 THIS 但正如回答问题的人所说 "Its sloppy and halfway."
有没有办法解决这个问题?如果是,我该怎么做?
你可以再试一件事。尝试替换代码
var temp = dsWinners.Tables[0].Rows[index];
具有以下内容::
var temp = dsWinners.Tables[0].NewRow();
temp.ItemArray = dsWinners.Tables[0].ItemArray;
这是创建新行并将其移动到给定位置,而不是移动现有行。
尝试以下操作:
var temp = dsWinners.Tables[0].Rows[index]; \getting row
var newrow = dsWinners.Tables[0].NewRow(); \ creating new row to insert
newrow.ItemArray = temp.ItemArray; \ copying data from old to new row
dsWinners.Tables[0].Rows[index].Delete(); \deleting old row.
dsWinners.Tables[0].Rows.InsertAt(newrow, index - 1); \ adding new row.
您可以向包含该位置的 table 添加一列,而不是删除该行并在另一个位置再次添加它。
您不会将 DataGridView 绑定到 table 本身,而是绑定到按位置列排序的 DataView。
在 DataGridView 中,您将添加除 Position 之外的所有列,以便不显示 Position。
当您向上或向下移动一行时,位置单元格的值分别与上一行或下一行交换。由于DataView是按位置排序的,因此移动会立即反映在DataView中。
以下控制台应用程序显示了基本步骤:
void Main()
{
// Create a new DataTable
DataTable tbl = GetData();
// Add Position column and initialize it
tbl.Columns.Add("Position", typeof(int));
for(int i = 0; i < tbl.Rows.Count; i++)
tbl.Rows[i]["Position"] = i;
PrintView("Original", tbl.DefaultView);
// Create a view that is sorted by the Position column
var view = new DataView(tbl);
view.Sort = "Position";
PrintView("Sorted", view); // No change as the rows are in original order anyway
// Move a row
SwapPositions(view, 0, 1); // Move first row down
PrintView("Swapped", view);
}
private DataTable GetData()
{
DataTable tbl = new DataTable();
tbl.Columns.Add("Value", typeof(string));
for(int i = 0; i < 3; i++)
tbl.Rows.Add("Text " + i.ToString());
return tbl;
}
private void PrintView(string header, DataView view)
{
Console.WriteLine(header);
foreach(DataRowView row in view)
Console.WriteLine("{0}\t{1}", row["Position"], row["Value"]);
}
private void SwapPositions(DataView view, int rowIndex1, int rowIndex2)
{
// Save rows as the change in the Position column is reflected immediately
DataRowView row1 = view[rowIndex1];
DataRowView row2 = view[rowIndex2];
// Now swap positions
var saveValue = row1["Position"];
row1["Position"] = row2["Position"];
row2["Position"] = saveValue;
view.Table.AcceptChanges();
}
输出为:
Original
0 Text 0
1 Text 1
2 Text 2
Sorted
0 Text 0
1 Text 1
2 Text 2
Swapped
0 Text 1
1 Text 0
2 Text 2
这是最后一个索引 table 移动到数据集中的第一个索引:
DataSet dsIndexchange = new DataSet();
DataTable dtdummysummary = new DataTable();
dtdummysummary = dsAssetInterval.Tables[dsAssetInterval.Tables.Count-1];
dsAssetInterval.Tables.RemoveAt(dsAssetInterval.Tables.Count-1);
dsIndexchange.Tables.Add(dtdummysummary);
for (int i = 0; i < dsAssetInterval.Tables.Count; i++)
{
dsIndexchange.Tables.Add(dsAssetInterval.Tables[i].Copy());
}