我为 DataGridView 创建了一个上下文菜单,用于操作各种不合格的制表符分隔文件中的数据。 (旧的金融东西)
我需要的功能之一是将所有列移至右侧。
我试图理解 .Insert、.Add 和 .Clone 但无济于事,因为共享者远远高于我作为编码员。
请看一下这个并给出一些改进的想法,因为对于长文件,暂停是痛苦的。
private void dgv_MoveColumnRight(DataGridView dgv, int cIndex)
{
dgv.ColumnCount = dgv.ColumnCount + 1;
int cCount = dgv.ColumnCount - 2;
if (dgv.RowCount <= 1) { return; }
while (cCount >= cIndex)
{
dgv_CopyColumn(dgv, cCount);//showMe.Comment = "From: " + n1.ToString();
dgv_PasteColumn(dgv, cCount + 1);
//dgv.Rows[1].Cells[cCount].Value = "*";
cCount--;
Application.DoEvents();
}
for (int n = 0; n < dgv.RowCount; n++)
{
dgv.Rows[n].Cells[cIndex].Value = " ";
}
}
List<string> colData = new List<string>();
private void dgv_CopyColumn(DataGridView dgv, int cIndex)
{
colData.Clear();
for (int n = 0; n < dgvStatement.RowCount; n++)
{
if(dgv.Rows[n].Cells[cIndex].Value != null)
{
colData.Add(dgv.Rows[n].Cells[cIndex].Value.ToString());
}
else
{
colData.Add(" ");
}
showMe.Comment = n.ToString() + "\t" + colData[n];
}
}
private void dgv_PasteColumn(DataGridView dgv, int cIndex)
{
if (colData.Count == 0) { return; }
for (int n = 0; n < dgvStatement.RowCount; n++)
{
dgv.Rows[n].Cells[cIndex].Value = colData[n];
}
}
最终代码将传递列表而不是将其公开。
谢谢
您是否尝试过在重新绘制时不更新网格?...在此示例中,您还可以通过创建新列、对其位置进行排序并清理“旧”列来进行改进
private void dgv_MoveColumnRight(DataGridView dgv, int cIndex) {
....
// Suspend visual refresh of the DataGridView
dgv.SuspendLayout();
//Create new column last
dgv.Columns.Add(new DataGridViewTextBoxColumn());
// Move columns
for (int colIndex = dgv.ColumnCount - 2; colIndex >= cIndex; colIndex--)
{
MoveColumnData(dgv, colIndex, colIndex + 1);
}
// Clean "old" column
for (int rowIndex = 0; rowIndex < dgv.RowCount; rowIndex++)
{
dgv.Rows[rowIndex].Cells[cIndex].Value = null;
}
// Perform DataGridView Visual Update
dgv.ResumeLayout();
}
private void MoveColumnData(DataGridView dgv, int fromIndex, int toIndex)
{
for (int rowIndex = 0; rowIndex < dgv.RowCount; rowIndex++)
{
dgv.Rows[rowIndex].Cells[toIndex].Value = dgv.Rows[rowIndex].Cells[fromIndex].Value;
}
}
祝你好运