我在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 中顯示的順序保存它們,并且仍然能夠在兩個列順序之間切換?
uj5u.com熱心網友回復:
DataGridView Column 有很多方法可以解決它們,兩種是它們的名稱或它們在 DataGridView 集合中的索引號。
用戶創建列名,但索引是在創建列時由系統創建的,我看不到編輯這個數字的方法。
如果你想重新排序,你在 GUI 中的列的視覺順序你改變了 DisplayIndex。這不會更改列的索引號。它只是改變了 DGV 在 UI 中的外觀。
我創建了一個小示例,您可以從https://github.com/zizwiz/DataGridView_ReorderColumn_Example下載
當您通過復制到剪貼板保存左手重新排序的 DGV 時,您會在 GUI 中看到視圖,但如果您通過決議網格保存,您將獲得原始索引視圖。要解決此問題,如果您想重新排序,然后通過決議 DGV 來保存它,那么您必須按照您現在想要的順序將原始 DGV 逐列復制到新的 DGV 中。有很多方法可以做到這一點,我只是以簡單的方式展示您可能想要做的是將列放在臨時串列中,洗掉所有列并再次添加它們。
在創建列后,我找不到更改列的索引屬性的方法,因此我使用了這種復制方法,雖然很麻煩。
由于這只是一個簡單的示例,它并沒有人們可能想要使用的所有花里胡哨,它只是說明了我如何克服遇到的問題。您保存的檔案與您運行的“exe”放在同一檔案夾中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/429717.html
下一篇:如何防止彈出表單超出螢屏區域?
