我在運行時動態創建列。我可以使用洗掉鍵洗掉行,但不能洗掉列。我發現的每種方法都涉及按列 ID 或列名洗掉列。為了做到這一點,我必須在被選中時以某種方式找到列名,然后將其存盤在某處,然后撰寫代碼進行洗掉。我的問題是為什么我們不能只洗掉行之類的列。?我的問題有沒有更簡單的解決方案(選擇一列并用鍵洗掉它)?是的,在來這里之前,我幾乎瀏覽了所有帖子/問題。
uj5u.com熱心網友回復:
嗯……一個可能的“粗略”但簡單的解決方案是如果用戶單擊列標題單元格,則洗掉該列。顯然這不是一個好主意,因為大多數用戶希望在單擊標題時網格按該列排序,我們仍然希望他們能夠這樣做。所以..可能添加用戶必須按住“Ctrl”鍵并單擊列標題以洗掉列的要求。
但是,我認為您需要一些機制來恢復(取消洗掉)所有以前洗掉的列。在這種情況下,我們可以要求用戶同時按下“Ctrl”鍵和“Alt”鍵來恢復原始資料源中的所有列。如果您沒有使用資料源來恢復網格,您可能需要手動重新填充整個網格。還應該注意的是,如果用戶使用“Ctrl”單擊洗掉了所有列,那么用戶將永遠無法取回這些列,因為將沒有列標題單元格可供單擊。可能總是至少顯示一列。
您可以將此代碼放在網格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);
}
}
編輯…
經過審查,顯然更好的方法是“隱藏”該列,而不是實際“洗掉”該列。這樣,如果網格沒有資料源,那么您應該能夠“取消隱藏”列,而不是被迫“重新創建”它。無論網格是否使用資料源,這種方法都有效。
這需要更改代碼,因為比較...
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;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/420883.html
標籤:
上一篇:服務總線訂購快速連續訊息
下一篇:在.NET中決議XML檔案
