如何以更新的顺序保存重新排序的 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”放在同一文件夹中
我在 winform 中有一个 datagridview,我将数据读入其中。我在我使用的循环中以计数命名每一列。读取数据的部分功能如下。我读取的文件是从 excel.
创建的 csvwhile (!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”放在同一文件夹中