为什么我们不能在默认情况下在 C# 中使用 delete 键删除 datagridview 列?
Why we cannot delete datagridview columns with delete key in C# on default?
我在运行时动态创建列。我可以使用删除键删除行,但不能删除列。我发现的每种方法都涉及按列 ID 或列名删除列。为了做到这一点,我必须在选择时以某种方式找到列名,然后将其存储在某个地方,然后编写代码进行删除。我的问题是为什么我们不能像行一样删除列。?我的问题有没有更简单的解决方案(选择一列并用键删除它)?是的,在来这里之前,我已经经历了几乎所有 post/question。
嗯……一个可能的“粗略”但简单的解决方案是在用户单击列 header 单元格时删除该列。显然这不是一个好主意,因为大多数用户希望在单击 header 时网格按该列排序,而我们仍然希望他们能够这样做。所以..可能添加用户必须按住“Ctrl”键并单击列header以删除该列的要求。
但是,我认为您需要某种机制来恢复(取消删除)所有先前删除的列。在这种情况下,我们可以要求用户同时按下“Ctrl”键和“Alt”键来恢复原始数据源中的所有列。如果您不使用数据源然后恢复网格,您可能需要手动 re-fill 整个网格。还应注意,如果用户使用“Ctrl”单击删除所有列,则用户将永远无法取回这些列,因为将没有列 header 单元格可供单击。可能总是至少显示一列。
您可以将此代码放入网格 ColumnHeaderMouseClick
事件中,它可能看起来像……
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
if (Control.ModifierKeys.HasFlag(Keys.Control) && Control.ModifierKeys.HasFlag(Keys.Alt)) {
dataGridView1.DataSource = null;
dataGridView1.DataSource = YourGridsDataSource; // or re-fill the grid if it has no data source
return;
}
if (dataGridView1.ColumnCount == 1) {
return;
}
if (Control.ModifierKeys.HasFlag(Keys.Control)) {
dataGridView1.Columns.Remove(dataGridView1.Columns[e.ColumnIndex].Name);
}
}
编辑…
经过审查,显然更好的方法是“隐藏”该列,而不是实际“删除”该列。这样,如果网格没有数据源,那么您应该能够“取消隐藏”该列,而不是被迫“re-create”它。无论网格是否使用数据源,这种方法都有效。
这需要更改代码,因为比较...
if (dataGridView1.ColumnCount == 1) {
将不再有效,因为列仍然存在。下面的代码简单地遍历网格列并计算有多少列不可见。然后我们使用此计数来确保至少有一列始终保持可见。
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
if (Control.ModifierKeys.HasFlag(Keys.Control) && Control.ModifierKeys.HasFlag(Keys.Alt)) {
foreach (DataGridViewColumn column in dataGridView1.Columns) {
column.Visible = true;
}
return;
}
int count = 0;
foreach (DataGridViewColumn column in dataGridView1.Columns) {
if (!column.Visible) {
count++;
}
}
if (dataGridView1.ColumnCount - count <= 1) {
return;
}
if (Control.ModifierKeys.HasFlag(Keys.Control)) {
dataGridView1.Columns[e.ColumnIndex].Visible = false;
}
}
我在运行时动态创建列。我可以使用删除键删除行,但不能删除列。我发现的每种方法都涉及按列 ID 或列名删除列。为了做到这一点,我必须在选择时以某种方式找到列名,然后将其存储在某个地方,然后编写代码进行删除。我的问题是为什么我们不能像行一样删除列。?我的问题有没有更简单的解决方案(选择一列并用键删除它)?是的,在来这里之前,我已经经历了几乎所有 post/question。
嗯……一个可能的“粗略”但简单的解决方案是在用户单击列 header 单元格时删除该列。显然这不是一个好主意,因为大多数用户希望在单击 header 时网格按该列排序,而我们仍然希望他们能够这样做。所以..可能添加用户必须按住“Ctrl”键并单击列header以删除该列的要求。
但是,我认为您需要某种机制来恢复(取消删除)所有先前删除的列。在这种情况下,我们可以要求用户同时按下“Ctrl”键和“Alt”键来恢复原始数据源中的所有列。如果您不使用数据源然后恢复网格,您可能需要手动 re-fill 整个网格。还应注意,如果用户使用“Ctrl”单击删除所有列,则用户将永远无法取回这些列,因为将没有列 header 单元格可供单击。可能总是至少显示一列。
您可以将此代码放入网格 ColumnHeaderMouseClick
事件中,它可能看起来像……
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
if (Control.ModifierKeys.HasFlag(Keys.Control) && Control.ModifierKeys.HasFlag(Keys.Alt)) {
dataGridView1.DataSource = null;
dataGridView1.DataSource = YourGridsDataSource; // or re-fill the grid if it has no data source
return;
}
if (dataGridView1.ColumnCount == 1) {
return;
}
if (Control.ModifierKeys.HasFlag(Keys.Control)) {
dataGridView1.Columns.Remove(dataGridView1.Columns[e.ColumnIndex].Name);
}
}
编辑…
经过审查,显然更好的方法是“隐藏”该列,而不是实际“删除”该列。这样,如果网格没有数据源,那么您应该能够“取消隐藏”该列,而不是被迫“re-create”它。无论网格是否使用数据源,这种方法都有效。
这需要更改代码,因为比较...
if (dataGridView1.ColumnCount == 1) {
将不再有效,因为列仍然存在。下面的代码简单地遍历网格列并计算有多少列不可见。然后我们使用此计数来确保至少有一列始终保持可见。
private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) {
if (Control.ModifierKeys.HasFlag(Keys.Control) && Control.ModifierKeys.HasFlag(Keys.Alt)) {
foreach (DataGridViewColumn column in dataGridView1.Columns) {
column.Visible = true;
}
return;
}
int count = 0;
foreach (DataGridViewColumn column in dataGridView1.Columns) {
if (!column.Visible) {
count++;
}
}
if (dataGridView1.ColumnCount - count <= 1) {
return;
}
if (Control.ModifierKeys.HasFlag(Keys.Control)) {
dataGridView1.Columns[e.ColumnIndex].Visible = false;
}
}