2010-04-21 61 views
7

在vs2008中使用winforms。我有一個DataGridView,我想檢測垂直滾動條何時可見。我應該註冊哪個事件?如何檢測DataGridView控件中的垂直滾動條

我正在添加網格最後一列中的每個單元格值的總和,並在DataGridView底部的文本框中顯示該值。

即使在滾動條出現之後,我希望此文本框與單元格值保持一致(我已經使它們右對齊,因爲它是$$值)。

回答

8

覆蓋DGV行爲通常是脖子上的巨大痛苦。儘管這很快就會發生。在窗體中添加一個新類並粘貼下面顯示的代碼。編譯。將新控件從工具欄的頂部拖放到表單上。實施ScrollbarVisibleChanged事件。

using System; 
using System.Windows.Forms; 

class MyDgv : DataGridView { 
    public event EventHandler ScrollbarVisibleChanged; 
    public MyDgv() { 
     this.VerticalScrollBar.VisibleChanged += new EventHandler(VerticalScrollBar_VisibleChanged); 
    } 
    public bool VerticalScrollbarVisible { 
     get { return VerticalScrollBar.Visible; } 
    } 
    private void VerticalScrollBar_VisibleChanged(object sender, EventArgs e) { 
     EventHandler handler = ScrollbarVisibleChanged; 
     if (handler != null) handler(this, e); 
    } 
} 
+0

哎喲,這似乎是一個痛苦只是檢測時,一列已經被調整出。 – Billy 2010-04-21 19:05:54

+4

@比利:總是一個錯誤,不能說你爲什麼需要一些東西。使用DGV的ColumnWidthChanged事件。 – 2010-04-21 19:35:04

0

我覺得there's任何情況下,對於...但你可以在網格可以成長的所有地方的東西嘗試這樣的:

  • 獲取實際的行數網格視圖+標題
  • 將該數字乘以每一行的高度
  • 如果結果大於DataGrid的高度,則必須有一個垂直滾動條。
0

自從他回答問題後,我給了漢斯帕斯坦的複選標記......但是,我又找到了解決方案的另一條路線。由於對話框是模態的,因此項目列表將不會從創建時間開始改變。所以我可以調用下面的代碼來確保當對話框第一次顯示時文本框位於正確的位置。

/// <summary> 
    /// Horizontally shifts the label and text boxes that display the total 
    /// values so that the totals remain aligned with the columns. 
    /// </summary> 
    private void ShiftTotalsDisplay(DataGridView grid, Label firstLabel, 
    TextBox secondTextBox, TextBox thirdTextBox) 
    {   
    //Note if you have a rowheader add the width here also. 
    int nameRightLoc = grid.Location.X +    
     grid.Columns[0].Width; 
    int fpRightLoc = nameRightLoc + 
     grid.Columns[0].DividerWidth + 
     grid.Columns[1].Width; 
    int dlRightLoc = fpRightLoc + 
     grid.Columns[1].DividerWidth + 
     grid.Columns[2].Width; 

    Point loc = firstLabel.Location; 
    loc.X = nameRightLoc - firstLabel.Width - 2; 
    firstLabel.Location = loc; 

    loc = secondTextBox.Location; 
    loc.X = fpRightLoc - secondTextBox.Width - 2; 
    secondTextBox.Location = loc; 

    loc = thirdTextBox.Location; 
    loc.X = dlRightLoc - thirdTextBox.Width - 2; 
    thirdTextBox.Location = loc;   
    } 
20
var vScrollbar = dataGridView1.Controls.OfType<VScrollBar>().First(); 
if (vScrollbar.Visible) 
{ 
} 
+0

謝謝你添加anwser。我目前正在學習Linq,並熱愛它提供的力量! – Billy 2011-10-14 15:00:49

+1

這應該是被接受的答案。我現在正在使用這個功能重新調整表單的大小,直到滾動條消失。 – 2013-08-07 20:34:02

0

如果您DGV是在面板內部,那麼你可以比較面板和DGV height屬性。如果dgv比面板大,那麼必須有一個滾動條,對吧?

像:

int panel_height = pnl.Height; 
int dgv_height = (dgv.RowCount + 1) * 24; // You can play around with this 24 according to your cell styles 
if (dgv_height > panel_height) MessageBox.Show("Voila!"); 
0

設置DGV最後一欄的 「AutoSizeMode」 屬性設置爲 「填充」,並設置文本框的寬度屬性等於dgv.Columns [ 「lastcolumn」]寬度。

1

除了使用Linq(Adam Butler)之外,您可以遍歷控件並註冊一個事件處理程序,每次滾動條可見性更改時都會調用該事件處理程序。我實現它的方式和它的作品相當順利:

private System.Windows.Forms.DataGridView dgCounterValues; 
private Int32 _DataGridViewScrollbarWidth; 

// get vertical scrollbar visibility handler 
foreach (Control c in dgCounterValues.Controls) 
if (c.GetType().ToString().Contains("VScrollBar")) 
{ 
    c.VisibleChanged += c_VisibleChanged; 
} 

在InitializeComponent() 之後做到這一點的地方在處理程序中,做任何你需要響應垂直滾動條的可見性改變的事情。水平滾動條(與HScrollBar控件取代VScrollBar)相同的工作原理:由於滾動

void c_VisibleChanged(object sender, EventArgs e) 
{ 
    VScrollBar vb = sender as VScrollBar; 
    if (vb.Visible) _DataGridViewScrollbarWidth = vb.Width; 
    else _DataGridViewScrollbarWidth = 0; 
} 
+0

適用於那些擁有.Net前Linq版本的用戶的有用代碼。然而,我會建議'if(c.GetType()。Equals(typeof(VScrollBar)))'比使用'ToString()'更好的相等比較。另外,這個foreach中的'break'聲明會使它更好。 – JPProgrammer 2016-02-10 09:57:15