2013-03-25 63 views
1

我想在C#或VB.NET中編寫的WinForms應用程序中的DataGridView的兩側添加一列按鈕。將按鈕列添加到C#或VB.NET中的DataGridView的右側

每個按鈕與行和移動與行的對應關係如下:兩側

  1. 按鈕總是可見,無論多麼廣泛的觀點得到。因此,即使用戶向左或向右滾動,按鈕仍保持固定並始終可見
  2. 隨着用戶在網格中上下滾動,按鈕會隨其相關聯的行一起滾動。

我想添加列到DataGridView和凍結他們(例如dataGridView1.Columns[0].Frozen = true),但問題沒有,我不能在網格凍結第一和最後一列。

有沒有另一種方法可以讓您想到在網格兩側都有一組動態按鈕?

回答

1

如果你想首先和所有列始終datagridview可見,然後用

DataGridView.AutoSizeColumnMode = Fill 

將會自動改變中間立柱當然寬度...

還是這裏的一些其他解決方法你的問題:

在你的DataGridView創建一個帶有按鈕(「左按鈕」)的第一列並凍結它。

然後在右側從主DataGridView創建另一個DataGridView(將其稱爲dgvRightButton

添加一個DatGridViewButtonColumn。然後同步的這兩datagridview

VB.NET代碼

Private Sub dgvTest1_Scroll(sender As Object, e As ScrollEventArgs) Handles dgvMain.Scroll 
    If e.ScrollOrientation = ScrollOrientation.VerticalScroll Then 
     Me.dgvRightButton.FirstDisplayedScrollingRowIndex = Me.dgvMain.FirstDisplayedScrollingRowIndex 
    End If 
End Sub 

測試代碼,我用第二datagridview滾動事件(還是VB.NET代碼,但註釋是C#):

//dgvRightButton_ButtonColumn - Buttons column instance(predefined column with Designer) 
//dgvMain_SomeValueColumn - predefined column from Main DataGridView 

Private Sub dgvRightButton_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvLeftButton.CellClick 
    //Check if column are buttons column(maybe you want add more columns later) 
    If Me.dgvRightButton_ButtonColumn.Name = Me.dgvRightButton.Columns(e.ColumnIndex).Name Then 
     //Getting value from Main DataGridView by rowIndex 
     Dim sValue As String = Me.dgvMain.Rows(e.RowIndex).Cells(Me.dgvMain_SomeValueColumn.Name).Value 
     MessageBox.Show(sValue) 
    End If 
End Sub 

添加按鈕的同樣數量的第二DataGridView將是如下:

Private Sub dgvRightButton_AddRows() 
    For i As Int32 = 0 To Me.dgvTest1.Rows.Count - 1 
     Me.dgvRightButton.Rows.Add(New String() {"Right"}) 
    Next 
End Sub 
+0

謝謝法比奧。我也想出了第二個DataGridView的這種方法並實現它。我將在下面添加一個答案來添加一些細節。不幸的是,我是新來的StackOverflow,我的名聲太低,以促進你的答案,否則我會這麼做。 – Jim 2013-03-27 17:05:59

0

除了法比奧的回答,我想給我自己的發現實施相同的方法。

我添加了兩個DataGridView組件,分別叫做dgvMaindgvDelete。後者位於前者的右側,是按鈕的出現位置。

對於dvgDelete它位於dgvMain以下18像素,其高度爲34像素較小。這確保了它始終與dgvMain一起滾動。我給它一個垂直滾動條,但不是水平的。

dgvMain我刪除了垂直滾動條。

我結合兩者爲相同的數據源(在我的情況的陣列),但是從自動生成列防止dgvDelete

dgvDelete.AutoGenerateColumns = false; 

我添加一列dgvDelete它包含的按鈕。

法比奧類似添加以下代碼(C#)來處理滾動。

private void dgvDelete_Scroll(object sender, ScrollEventArgs e) 
{ 
    if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) 
    { 
     dgvMain.FirstDisplayedScrollingRowIndex = dgvDelete.FirstDisplayedScrollingRowIndex;     
    } 
} 

我添加按鈕的一列dgvMain並凍結的第一列:

dgvMain.Columns[0].Frozen = true; 

所以現在我有固定在可編輯的數據的任一側的按鈕的一列。

將兩個網格綁定到相同數據源的一個很好的功能是,當您在dgvMain網格中移動時,dvgDelete對應行中的按鈕會自動突出顯示。

我甚至可能馬上添加第三個網格的dgvMain左側的按鈕中的第一列,但只有當對性能的影響可以忽略不計。

相關問題