更改数据集中的记录顺序

时间:2015-06-11 06:20:34

标签: c# winforms datagridview 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];
    }
}

但我收到错误说"此行已经属于此表。"在这一行:

dsWinners.Tables[0].Rows.InsertAt(temp, index - 1);

我知道我必须使用ImportRow(temp)而不是InsertAt(temp,index - 1),但问题是我不知道如何在正确的位置导入它。我已经看了THIS,但正如回答这个问题的那个人说的那样#34;它的草率和中途。"

无论如何,我能解决这个问题吗?如果是的话,我该怎么做?

4 个答案:

答案 0 :(得分:3)

您可以在包含该位置的表中添加一列,而不是删除该行并在另一个位置再次添加该行。

您不会将DataGridView绑定到表本身,而是绑定到按Position列排序的DataView。

在DataGridView中,您将添加除Position之外的所有列,以便不显示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

答案 1 :(得分:1)

尝试下面的事情:

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.

答案 2 :(得分:0)

你可以尝试一件事。尝试替换代码

var temp = dsWinners.Tables[0].Rows[index]; 

使用以下::

var temp = dsWinners.Tables[0].NewRow();    
temp.ItemArray = dsWinners.Tables[0].ItemArray;

这是创建一个新行并将其移动到给定位置而不是移动现有行。

答案 3 :(得分:0)

这是用于将最后一个索引表移至数据集中的第一个索引:

        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());
        }