2011-12-26 129 views
14

.NET 3.5でバグが発生しました。 Rows.Add()を使用してDataGridViewに行を追加すると、DGVが無効な間に垂直スクロールバーが正しく更新されません。したがって、DGVを再度有効にした後で、スクロールバーまたはマウスホイールを使用してDGVの一番下までスクロールすることはできません(矢印キーでナビゲートすることは可能です)。DataGridViewの垂直スクロールバーが正しく更新されない(フォームバグ?)

回避策を探しています。スクロールバーの境界を強制的に更新する方法がありますか、手動で新しい最大値を入力できますか?私はむしろDGVを再増殖させる必要はないでしょう。

*)実際には、それは無効になっている親フォームですが、問題はDGVコントロールに伝播していると想定しています。

答えて

13

私はちょうどこの問題を抱えていました(私のフォームは行を追加している間は無効にされていました)、行を追加する前にグリッドのスクロールバープロパティを 'None'に設定して解決しました行が追加されました。

+0

それでもその場しのぎのが、少しでも良いです。ありがとう。 :) – ReturningTarzan

+0

スーパー! Save me))) – Konstantin

+1

これは非常にうまくいっていますが、 'SetDataSource'が動作した後に' PerformLayout() 'を呼び出すだけです! –

0

実際、私はただ1つの回避策を見つけましたが、私はそれが気に入らないのです。 DGVを再び有効にしたら、これを行うことができます:

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

そして、スクロールバーが更新されます。しかし、あまりにもきれいではない、それは厄介な小さなちらつきを引き起こし、私は意図的に無視する必要があるいくつかのイベントを発生させる可能性があります。私はより良い解決策を望むために少し質問を残しておきます。

18

また、これは私のために問題を解決:

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

DGVを再度有効にする前にそれを呼び出すことができます。


UPDATE: これも仕事をしていません:

DataGridView.PerformLayout(); 
+0

autosizemode.fillで無効になっているスクロールバーに問題がありました。内容を変更した後にperformlayoutをやってくれました。ありがとう!あなたは私の日を救った! – MazarD

+0

ありがとうございました!その作業 – Raj

+2

これは受け入れられた答えでなければなりません。私も助けてくれました。ありがとうございました! –

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

Iは最初の投稿にコメントを追加したいです、しかし、私はまだ(50評点未満)ことはできません。

行を削除するときに同じ問題が発生しました。スクロールバーは無効のように見え、スライダは表示されず、矢印はグレーです。
at this link (explicitly enable the scrollbars again)に記載されている回避策を試すか、DGV全体を有効にしてください。
また、this link suggests the same workaround (explicitly enabling...)と呼ばれています。

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​​deにDataGridViewAutoSizeRowsMo​​de.AllCellsの設定は私のために問題を修正しました。

水平スクロールで同様の問題が発生した場合は、AutoSizeColumnsModeで再生すると問題が解決するはずです。

0

スライダーが正しくサイジングと私の解決策だった垂直スクロールバーのほとんど取り上げていなかったとして -

DGV.height = DGV.Height + 1

DGV.Height = DGV.Height - 1

は、次にスライダーが正しく

をサイズにされた。しかし、私は今

DGV.PerformLayout

を使用します

これはまた問題を解決します。

-2

私のDataGridViewの最後の2行は常に私のWinFormsで隠されていました。キーボードの下向き矢印キーを使用してスクロールすることができます(ただし、実際にはどの行が表示されているかわかりません)。マウスのホイールとスクロールバーの下向きの矢印は、どちらにも届きません。小さなデータセットでのみフォームを最大化すると、最後の2行が表示されます。

問題を修正したのは以下のとおりです。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

私の解決方法は、スクロールバーのプロパティからスクロールバーを無効にすることでした。 その後、ウィンドウを初期化した後にコード行から有効にします。 = ScrollBars.Both

0

DataGridViewObj.ScrollBarsは、私にとっての問題は、私は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; 
    }; 
} 
関連する問題