1

C#またはVB.NETで記述されたWinFormsアプリケーションのDataGridViewの両側にボタンの列を追加したいと思います。

各ボタンは行に関連付けられており、次のように行とともに移動します。

  1. ビューの幅に関係なく、両側のボタンは常に表示されます。したがって、ユーザーが左または右にスクロールしても、ボタンは所定の位置に固定され、常に表示されます
  2. ユーザーがグリッド内を上下にスクロールすると、ボタンは関連する行とともにスクロールします。

DataGridViewに列を追加してフリーズすることを考えましたが(たとえばdataGridView1.Columns[0].Frozen = true)、グリッドの最初と最後の列の両方をフリーズできないという問題があります。

グリッドの両側に動的なボタンのセットを配置することを考えることができる別の方法はありますか?

4

2 に答える 2

1

最初にすべての列を常に表示する場合はdatagridview、を使用します

DataGridView.AutoSizeColumnMode = Fill

もちろん、真ん中の列の幅は自動的に変更されます...

または、ここで問題の別の回避策をいくつか示します。

DataGridViewボタン(「左ボタン」)を使用して最初の列を作成し、それをフリーズします。

次に、メインの右側にDataGridView別のメインを作成しますDataGridView(これを呼び出しますdgvRightButton

1つ追加しDatGridViewButtonColumnます。次に、この2つのスクロールイベントを同期します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

私が2番目に使用したテストコード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
于 2013-03-26T10:07:44.167 に答える
0

ファビオの答えに加えて、私は同じアプローチを実装した私自身の発見を与えたいと思いました。

dgvMainとという2つのDataGridViewコンポーネントを追加しましdgvDeleteた。後者は前者のすぐ右側に配置され、ボタンが表示される場所です。

それdvgDeleteは18ピクセル下dgvMainに配置され、その高さは34ピクセル小さいからです。これにより、と一貫してスクロールすることが保証されdgvMainます。私はそれに垂直スクロールバーを与えましたが、水平ではありませんでした。

dgvMainで、垂直スクロールバーを削除しました。

両方を同じデータソース(私の場合は配列)にバインドしましたが、dgvDelete列を自動的に生成できませんでした:

dgvDelete.AutoGenerateColumns = false;

dgvDeleteボタンを含む列を1つ追加しました。

Fabioと同様に、スクロールを処理するために次のコード(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が自動的に強調表示されることです。

ボタンの最初の列のすぐ左に3番目のグリッドを追加することもできdgvMainますが、パフォーマンスへの影響が無視できる場合に限ります。

于 2013-03-27T17:26:28.803 に答える