0

所以我在这里有一段代码可以工作,除了一行是 InsertAt() 部分。我想知道是否可以复制最后一行并将其作为第一行插入。把这个想法想象成这样。它可能可以单独在它后面的 SQL 中完成,但是这个应用程序被设计为适用于非常旧的数据库和 oracle,所以在系统完全迁移之前,它必须这样做,不幸的是。

事先的

  • 装运地点 1
  • 装运地点 2
  • 装运地点 2

  • 开始位置
  • 装运地点 1
  • 装运地点 2
  • 装运地点 3
  • 目的地位置

代码片段:

// Create a DataTable with a list of shipments.    
DataTable dt = c.Query(c.qShipments(Row.Cells[0].Value.ToString()));
// Check if there is at least one shipment
if (dt.Rows.Count >= 1)
{
    // Add the destination of the shipments
    dt.Rows.Add(0, 0, 9999, textBox_CC.Text, textBox_PC.Text, textBox_SL.Text);
    // Add the starting location (which is the same as the destination. It has to be at the top of the DataTable
    dt.Rows.InsertAt(dt.Rows[dt.Rows.Count - 1], 0); // The code

    // Finally calculate and return the object to populate the datagridview with.
    dataGridView_CalculatedRoutes.Rows.Add(x.getRoute(dt));
}

tldr;

问题:代码返回 Row 属于另一个表。

问题:如何让最后一行也成为第一行?

编辑问题:如何让最后一行成为第一行和最后一行。(相同的行)

4

2 回答 2

1

您要添加的行已经是该数据表的一部分。您必须先将其删除。在一个简短的测试中,我发现删除一行似乎会删除该行中的数据,因此Remove()似乎InsertAt()不起作用。

但是您可以创建一个新行,将数据复制到该行并插入它。之后,您可以删除旧行。例如(使用 Linqpad 测试):

void Main() 
{
    DataTable dt = new DataTable();
    dt.Columns.Add(new DataColumn("Test", typeof(System.String)));
    var row = dt.NewRow();
    row["Test"] = "1";
    dt.Rows.Add(row);
    row = dt.NewRow();
    row["Test"] = "2";
    dt.Rows.Add(row);
    row = dt.NewRow();
    row["Test"] = "3";
    dt.Rows.Add(row);

    Console.WriteLine("Order before Remove/InsertAt");
    foreach(DataRow rw in dt.Rows)
    {
        Console.WriteLine(rw["Test"]);
    }

    var lastRow = dt.Rows[dt.Rows.Count - 1];
    var newFirstRow = dt.NewRow();
    newFirstRow.ItemArray = lastRow.ItemArray;
    dt.Rows.Remove(lastRow);
    dt.Rows.InsertAt(newFirstRow, 0);

    Console.WriteLine("Order after Remove/InsertAt");
    foreach(DataRow rw in dt.Rows)
    {
        Console.WriteLine(rw["Test"]);
    }
}

预期的输出是:

Order before Remove/InsertAt
1
2
3
Order after Remove/InsertAt
3
1
2
于 2013-01-22T11:37:20.783 回答
1

您可以创建一个新DataTable的并按您想要的顺序导入行:

// Create a DataTable with a list of shipments.    
DataTable dt = c.Query(c.qShipments(Row.Cells[0].Value.ToString()));
// Check if there is at least one shipment
if (dt.Rows.Count >= 1)
{
    DataTable customDt = new DataTable();

    // Add the starting location (which is the same as the destination. It has to be at 
    customDt.Rows.Add(0, 0, 9999, textBox_CC.Text, textBox_PC.Text, textBox_SL.Text);

    foreach(DataRow row in dt.Rows)
    {
        customDt.ImportRow(row);
    }
    // Add the destination of the shipments
    customDt.ImportRow(customDt.Rows[0]);

    // Finally calculate and return the object to populate the datagridview with.
    dataGridView_CalculatedRoutes.Rows.Add(x.getRoute(dt));
}
于 2013-01-22T12:14:43.910 回答