2011-12-26 111 views
14

我在.NET 3.5中遇到了一個錯誤(我假設)。使用Rows.Add()將行添加到DataGridView時,禁用DGV時,垂直滾動條無法正確更新。因此,在重新啓用DGV後,您無法使用滾動條或鼠標滾輪一直滾動到DGV底部(使用箭頭鍵導航仍然有效)。DataGridView垂直滾動條沒有正確更新(Forms bug?)

所以我正在尋找解決方法。有沒有辦法強制滾動條更新其邊界,或者你可以手動輸入一個新的最大值?我寧願不必重新填充DGV。

*)實際上,它是禁用的父窗體,但我認爲問題在於它傳播到DGV控件。

回答

13

我只是有這個問題(同時增加了我行的形式被禁用),並通過設置網格的滾動條屬性設置爲「無」之前添加行,然後設置回解決這兩個「一次我所有的行已添加。

+0

仍然是一個雜牌,但稍微好一點。謝謝。 :) – ReturningTarzan 2012-02-05 00:01:10

+0

超級!保存我))) – Konstantin 2015-12-22 18:01:07

+1

這個工作得很好,但是'SetDataSource'也可以調用'PerformLayout()'! – 2017-01-19 08:53:49

0

其實,我只是找到了一種解決方法,但我不喜歡它。 DGV重新啓用後,您可以這樣做:

int x = Rows.Add(); 
Rows.RemoveAt(x); 

然後滾動條被更新。但它不是很漂亮,它會引起一個令人討厭的小閃爍,它可能會引發一些我不得不故意忽略的事件。我會留下這個問題,希望有更好的解決方案。

18

這也解決了這個問題對我來說:

DataGridView.SuspendLayout(); 
DataGridView.ResumeLayout(); 

重新啓用之前DGV是它可以被調用。


UPDATE: 這也不會工作:

DataGridView.PerformLayout(); 
+0

我對autosizemode.fill禁用滾動條時遇到問題,在更改內容後執行performlayout也適用於我。謝謝!你救了我的一天! – MazarD 2014-03-17 20:05:21

+0

謝謝!!!其工作 – Raj 2015-05-30 06:00:56

+2

這應該是被接受的答案。也幫助了我。謝謝! – 2015-11-12 12:56:33

0

有人認爲,當DataGridView1的寬度和高度分別與寬度和形狀的高度,寬度和高度相比如果它們超出了窗體的尺寸,則重置它們,滾動條變得可見。

嘗試下面的代碼,這將動態DataGridView控件添加到窗體,並創建一個正方形格子的行和列標題名稱:

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     'Following code adds a Datagridview control to a Form dynamically 
     'Step 1. Add a textbox to a Form, and input the number of columns (ncol). (Note: in this example, ncol=nrow). 
     'Step 2. Set the Form's Windowstate property to Maximized 
     For Each cont As Control In Me.Controls 'remove DataGridView if it already exists on the Form 
      If TypeOf (cont) Is DataGridView Then 
       Me.Controls.Remove(cont) 
      End If 
     Next 
     Dim DataGridView1 As New DataGridView 'create new data grid view dynamically during run-time 
     Me.Controls.Add(DataGridView1) 'add the data grid view to the Form 
     Me.Refresh() 
     Dim i, nrow, ncol As Integer ' ncol=nrow -->this is a square grid 
     ncol = TextBox1.Text 
     nrow = ncol 'Note: add a second textbox to the form and input nrow if you don't want a square grid 
     DataGridView1.Visible = True 
     DataGridView1.Top = 100 
     DataGridView1.Left = 100 
     DataGridView1.Rows.Clear() 
     Do While DataGridView1.Columns.Count > 0 
      DataGridView1.Columns.RemoveAt(DataGridView1.Columns.Count - 1) 
     Loop 
     For i = 1 To ncol 
      DataGridView1.Columns.Add(i, "V" & i) 
     Next 
     DataGridView1.Width = ncol * 115 
     DataGridView1.Height = nrow * 22 + 45 
     If DataGridView1.Width > Me.Width - DataGridView1.Left Then DataGridView1.Width = Me.Width - DataGridView1.Left - 20 
     If DataGridView1.Height > Me.Height - DataGridView1.Top Then DataGridView1.Height = Me.Height - DataGridView1.Top - 50 
     DataGridView1.ScrollBars = ScrollBars.None 
     For i = 1 To nrow 
      DataGridView1.Rows.Add() 
      DataGridView1.Rows.Item(i - 1).HeaderCell.Value = "V" & i 
     Next 
     DataGridView1.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders) 
     Dim dgvColumnHeaderStyle As New DataGridViewCellStyle() 
     dgvColumnHeaderStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 
     DataGridView1.ColumnHeadersDefaultCellStyle = dgvColumnHeaderStyle 
     DataGridView1.AllowUserToAddRows = False 
     DataGridView1.ScrollBars = ScrollBars.Both 
     Me.WindowState = FormWindowState.Maximized 
    End Sub 
0

我的問題源於在用戶線程中調用dgv.Add()。之後將其更改爲從UI線程,而不是被調用,滾動條顯示和功能正常:

 if (dataGridView1.InvokeRequired) 
     { 
      dataGridView1.Invoke((Action)(() => dataGridView1.Rows.Add(new String[] { abc, efg }))); 
     } 
     else 
     { 
      dataGridView1.Rows.Add(new String[] { calPoint, logUrl }); 
     } 
1

如果沒有其他特定解決方案爲你工作,我遇到了類似的問題中附帶的DataGridView垂直滾動條。但問題就像每當行數超出datagridview的高度時,垂直滾動就會創建一個混亂的UI。各種行相互重疊。

我有一個數據綁定DataGridView。

這些是我嘗試過但沒有工作的列表。

  1. 將ScrollBars屬性設置爲None,修改數據源,然後將ScrollBars屬性設置爲Both。
  2. 以各種組合使用SuspendLayout,ResumeLayout和PerformLayout。
  3. 使用擴展方法爲DataGridView設置雙緩衝。

最後,設置AutoSizeRowsMo​​deDataGridViewAutoSizeRowsMo​​de.AllCells固定我的問題。

如果你有類似的水平滾動問題,我覺得玩AutoSizeColumnsMode應該解決這個問題。

0

當滑塊未正確尺寸和佔去了大部分的垂直滾動條我的解決辦法是的 -

DGV.height = DGV.Height + 1

DGV.Height = DGV.Height - 1

然後滑塊正確尺寸

但我現在用

DGV.PerformLayout

這也解決了問題

-2

我的DataGridView的最後兩行總是隱藏在我的WinForms上。我可以使用鍵盤向下箭頭鍵滾動到他們(但仍然沒有看到我實際上在哪一行)。鼠標滾輪和滾動條向下箭頭也不會到達他們。只有使用小數據集並使表單最大化,才能看到最後兩行。

下面是我如何解決這個問題:我將DataGridView放置在Panel中。 BAM!

它還修復了DataGridView的另一個問題,即當我調整列標題大小時,奇怪的垂直線會出現在DataGridView下的任何UI控件上。這是非常醜陋和不專業的期待。但現在它也是固定的。

0

我在搜索針對我遇到的問題的修復時找到了您的帖子。我在Microsoft Surface(Win10)上遇到的情況是無法使用觸摸手勢(如輕彈)將DataGridView垂直滾動到長列表的最後一行。通常,最後一行非常難以實現。解決方案很簡單,但花了我一段時間才弄清楚。如果有幫助,我會把它留在這裏。

// Override WndProc in your custom class inherited from DataGridView 
protected override void WndProc(ref Message m) 
{ 
    switch (m.Msg) 
    { 
    case 0x115:// WM_VSCROLL 
     // The low-order word holds the command 
     uint cmd = ((uint)m.WParam & (uint)0x0000FFFF); 
     switch (cmd) 
     { 
     case 5: // SB_THUMBTRACK 
      if (Rows.Count > 0) 
      { 
      // The high-order word holds the position 
      uint pos = ((uint)m.WParam & (uint)0xFFFF0000) >> 16; 

      // SAVE: This would give us the "true" ratio based on 100% 
      // SAVE: double ratio = (double)pos/(double)(VerticalScrollBar.Maximum - VerticalScrollBar.LargeChange); 
      // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%"); 

      // What we want is the ratio to the TOP of the thumb, BECAUSE 
      // THIS GIVES US THE RATIO TO THE FIRST LINE INDEX 
      double firstLineRatio = (double)pos/(double)(VerticalScrollBar.Maximum); 
      // We want to make it so that it shows the full line 
      // even if we just barely meet the ratio 
      double dFirstLine = firstLineRatio * Rows.Count; 
      int iFirstLine = (int)(dFirstLine + 0.9999); 
      // SAVE: Debug.WriteLine("Scroll Position: " + pos + "\t" + (ratio * 100.0).ToString("F2") + "%"); 
      FirstDisplayedScrollingRowIndex = iFirstLine; 
      // We do this INSTEAD OF the default for this message, so RETURN 
      return; 
      } 
      break; 
     } 
     break; 
    default: 
     break; 
    } 
    base.WndProc(ref m); 
} 
1

我的問題是我的垂直滾動條完全消失。我抨擊了所有上述建議,並最終發現使包含DataGridView的面板比表單狹窄的面板解決了問題。在我的情況下,16個像素工作較窄。

0

我的解決方案是從它的屬性中禁用滾動條。 然後在初始化窗口後從代碼行啓用它們。 DataGridViewObj.ScrollBars = ScrollBars.Both

0

對我來說,問題是,我把我的數據網格中,因此srolling被搞砸了這是不是在數據產生的時間顯示的TabPage

我發現了一個剛剛被自動魔鬼做出正確的更新/使能在每個可見變化:

public MyForm() 
{ 
    InitializeComponent(); 

    // Automatic scroll to bottom (it might not work if you try to do it without this event) 
    datagrid.RowsAdded += (sender, e) => 
    { 
     datagrid.FirstDisplayedScrollingRowIndex = datagrid.RowCount - 1; 
    }; 

    // WinForms bug fix: scrollbar update 
    datagrid.VisibleChanged += (sender, e) => 
    { 
     Enabled = false; 
     Enabled = true; 
    }; 
}