2011-08-12 85 views
0
 DataTable dt = new DataTable(); 
     dt.Columns.Add("col1"); 
     dt.Columns.Add("col2"); 
     dt.Columns.Add("col3"); 
     dt.Columns.Add("col4"); 
     dt.Columns.Add("col5"); 
     dataGridView1.DataSource = dt; 
     dataGridView1.Columns.RemoveAt(3); 
     dataGridView1.Columns.RemoveAt(2); 
     dataGridView1.Columns.RemoveAt(0); 

在此程序中,我創建了一個包含5列的DataTable。這將是DataGridView的DataSource。 DataTable中的某些列不需要被用戶看到,但稍後會被程序使用。刪除DataGridView列中的意外結果

在最後一行之後,列排列爲:col2,col5,col1,col3,col4。爲什麼會出現這樣的情況?不應該從DataGridView中刪除它嗎?我該怎麼做才能讓它看起來像是「col2,col5」?

編輯:我想刪除一些來自DataGridView的列,但仍然可以在DataTable中使用。此外,它在一個事件內(如Button_Click)

編輯:我仍然還沒有想出爲什麼會發生這種情況。我別無選擇,只能創建另一個線程(BackgroundWorker的)來做到這一點...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     DataTable dt = new DataTable(); 
     int i; 
     dataGridView1.Invoke((MethodInvoker)delegate 
     { 
      dt.Columns.Add("col1"); 
      dt.Columns.Add("col2"); 
      dt.Columns.Add("col3"); 
      dt.Columns.Add("col4"); 
      dt.Columns.Add("col5"); 
      dataGridView1.DataSource = dt; 
      dataGridView1.Columns.RemoveAt(3); 
      dataGridView1.Columns.RemoveAt(2); 
      dataGridView1.Columns.RemoveAt(0); 
     }); 
    } 

據我所知,哈里斯哈桑是正確的;包含DataGridView的表單應該至少出現一次。但我仍然感到困惑,爲什麼...

回答

0

據我知道你將要顯示的DataGridView一次,才能刪除任何列。嘗試通過顯示DataGridView一次,然後刪除列,看看會發生什麼

+0

我早些時候做過。我將代碼放在按鈕事件中刪除列的代碼中,當點擊按鈕時這些列被刪除。爲什麼刪除列的時間不在「dataGridView1.DataSource = dt;」之下? –

+0

我不知道細節爲什麼會發生這種情況,但我知道發生了這種情況。你可以做的事情就像處理DataGridView顯示時引發的事件一樣,並在這種情況下刪除列@ –

+0

@Gerald對不起,我真的很困惑......!你是說'RemoveAt'沒有移除列嗎? – NaveenBhat

0

可以使用的DataGridViewDisplayIndex屬性命令列。爲了隱藏一列,您可以將虛設置爲特定列的屬性可見屬性。

dataGridView1.Columns["ColumnTobeHided"].Visible = false; 
+0

但是這是用來改變列的排列。我不希望顯示其他列。我用RemoveAt(),但它並沒有刪除它們。那些'應該'被刪除的列只是在dataGridView1的末尾移動。 –

0

而不是刪除,你可以嘗試設置自己的知名度列...

 dataGridView1.DataSource = dt; 
     dataGridView1.Columns[3].Visible = false; 
     dataGridView1.Columns[2].Visible = false; 
     dataGridView1.Columns[0].Visible = false; 
+0

如果我做MessageBox.Show(dataGridView1.Columns [0] .Name);它仍然是「col1」。 我在程序的其他部分使用了RemoveAt()。兩者之間的唯一區別是我使用另一個線程將值存儲在DataTable中。之後,我做了和上面一樣的。奇怪的是,那一個工作。 –

+0

當你運行'MessageBox.Show(dataGridView1.Columns [0] .Name);'它將會是'col1',因爲你只是在改變可見性模式。 – NaveenBhat

0

如果您不希望表格中的所有列的網格中的列,請將datagridview.AutoGenerateColumns設置爲false,然後將數據表綁定到數據源。然後創建並綁定實際上想要的datagridview列。

AutoGenerateColumns默認爲true,但它很少給我們我們真正想要的東西。花時間根據需要構建datagridview列,不要相信默認處理。

+0

我不希望*所有*列,但我只想*他們中的一些出現在DataGridView上。通過「出現」,我的意思是將那些列從那裏刪除,而不是將它們隱藏起來...... –

+0

如果將AutoGenerateColmuns設置爲false,則默認情況下不會獲取任何列。然後,您可以添加代碼來創建所需的特定列。 AutoGenerateColumns = true將爲DataTable中的每個列創建一個DGV列,這不是您填寫的內容 – cdkMoose