如何以更新的顺序保存重新排序的 DataGridView 列?

How to save reordered DataGridView columns in the updated order?

我在 winform 中有一个 datagridview,我将数据读入其中。我在我使用的循环中以计数命名每一列。读取数据的部分功能如下。我读取的文件是从 excel.

创建的 csv
while (!parser.EndOfData)
{
   string[] fields = parser.ReadFields(); //read in the next row of data
   dgv_data.Rows.Add(); // add new row
   rowCount++;
   //put row number inside left margin
   dgv_data.Rows[rowCount - 1].HeaderCell.Value = rowCount.ToString(); 
  

   for (int i = 0; i < col; i++)
   {
      dgv_data.Rows[rowCount - 1].Cells[i].Value = fields[i]; //put the data into the cell

     //If the cell is true or a number greater than 1 then we colour it green 
     if (fields[i].ToLower() == "true") dgv_data.Rows[rowCount - 1].Cells[i].Style.BackColor = Color.SpringGreen;
     if (int.TryParse(fields[i], out num))
     {
      if (int.Parse(fields[i]) > 0) dgv_data.Rows[rowCount - 1].Cells[i].Style.BackColor = Color.SpringGreen;
     }
     dgv_data.Rows[rowCount - 1].Cells[i].Tag = (rowCount - 1).ToString() + ":" + i.ToString(); //Unique cell tag
     }
}

我需要对列重新排序,因为我需要以不同的顺序保存,但我还需要将它们重新排序回原始顺序,以便在两个不同的顺序之间切换。这是我用一个简单的函数来完成的,我在这里只显示了几个列,因为总共有 30 个。即使效率有点低,这也能很好地工作。

private void btn_reorder_Click(object sender, EventArgs e)
{
    if (flag)
    {
        flag = false;

        dgv_data.Columns[22].DisplayIndex = 0;
        dgv_data.Columns[20].DisplayIndex = 1;
        dgv_data.Columns[12].DisplayIndex = 2;
     }
     else
     {
         flag = true;

         dgv_data.Columns[0].DisplayIndex = 0;
         dgv_data.Columns[1].DisplayIndex = 1;
         dgv_data.Columns[2].DisplayIndex = 2;
      }
      dgv_data.Refresh();
}

当我需要将数据保存到 csv 文件时,问题就出现了,但我没有将它们保存在新顺序中。在保存之前,我需要操作几列,例如将秒更改为毫秒。使用以下方法,我可以做到这一点,但当我保存文件时,它始终具有原始布局。

var sb = new StringBuilder();

foreach (DataGridViewRow row in dgv_data.Rows)
{
   row.Cells[1].Value = (int.Parse(row.Cells[1].Value.ToString()) * 1000).ToString();

   var cells = row.Cells.Cast<DataGridViewCell>();
   sb.AppendLine(string.Join(",", cells.Select(cell => "\"" + cell.Value + "\"").ToArray()));
}

  File.WriteAllText(saveFileDialog1.FileName, sb.ToString());

我在互联网上找到了一种不同的方法,这确实保存了新的布局,但我无法在保存之前操作单元格。

dgv_data.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText;

// Select all the cells
dgv_data.SelectAll();
// Copy selected cells to DataObject
DataObject dataObject = dgv_data.GetClipboardContent();
// Get the text of the DataObject, and serialize it to a file
File.WriteAllText(saveFileDialog1.FileName, 
dataObject.GetText(TextDataFormat.CommaSeparatedValue));

如何确保在对列重新排序时,我可以按照它们在 DataGridView 中显示的顺序保存它们,并且仍然能够在两个列顺序之间切换?

DataGridView 列有很多方法可以解决它们,两个是它们的名称或它们在 DataGridView 集合中的索引号。

用户创建了列名,但索引是在创建列时由系统创建的,我看不出有什么办法可以编辑这个数字。

如果要重新排序,请更改 DisplayIndex 中 GUI 中列的视觉顺序。这不会更改列的索引号。它只是改变了 DGV 在 UI.

中的外观

我创建了一个小示例,您可以从 https://github.com/zizwiz/DataGridView_ReorderColumn_Example

下载

当您通过复制到剪贴板来保存左手重新排序的 DGV 时,您会在 GUI 中获得视图,但如果您通过网格解析来保存,您会获得原始索引视图。 要解决此问题,如果您想重新排序然后通过解析 DGV 来保存它,那么您必须按照您现在想要的顺序逐列将原始 DGV 复制到新的 DGV。有很多方法可以做到这一点,我只是简单地展示了您可能想要做的是将列放在临时列表中,删除所有列并再次添加它们。

创建列后找不到改变索引属性的方法,所以我用的是这种复制方法,虽然麻烦。

因为这只是一个简单的例子,它并没有提供人们可能想要使用的所有花里胡哨的东西,它只是说明了我是如何克服我遇到的问题的。您保存的文件与您 运行.

的“exe”放在同一文件夹中