Как расширить элемент управления для редактирования столбца DataGridView ComboBox с помощью второй крошечной кнопки? - PullRequest
0 голосов
/ 12 июля 2011

Я вставляю DataGridViewComboBoxColumn столбцы в DataViewGrid.Это отлично работает.

Теперь я хочу, чтобы пользователь мог не только выбрать один элемент списка, но и «развернуть» список, находящийся за списком, позволяя ему редактировать (вставлять / удалять / обновлять) список.

Я думаю, что было бы неплохо отобразить кнопку ".." прямо за кнопкой выпадающего списка.Нажатие на него приводит к диалогу, в котором можно вести список.

На что я натыкаюсь:

  1. Как бы я создал такой пользовательский комбинированный список? Достаточно ли открыт ComboBox (который является основой для поля со списком, которое столбец поля со списком создает в качестве элемента управления для редактирования), чтобы разместить такую ​​дополнительную кнопку?Каким был бы контейнер крошечного бутона - потомка ComboBox?
  2. Как я мог бы заставить сетку создавать и обрабатывать такой нестандартный комбинированный список?

В настоящее время я пытаюсь решить эту проблему путем создания подкласса DataGridViewComboBoxColum, использования потомка DataGridViewComboBoxCell в назначении CellTemplate и переопределения PositionWEditingPanel и PositionEditingControl для управления размерами панели и комбинированного списка, поэтому я быесть место для крошечной кнопки. Это правильный путь?

Или мне нужно создать потомка DataGridViewColumn, который создаст Panel, содержащий элемент управления редактирования комбинированного списка DataGridView и крошечную кнопку?Как бы я позаботился о том, чтобы столбец заботился о поле со списком, чтобы в нем были правильные элементы и т. Д.?

Возможно, я звучу смущенным, но, вероятно, после недель VB-кода (дох) ....*

1 Ответ

1 голос
/ 13 июля 2011

Вот код, который я придумал.Единственное, чего не хватает, так это обработчика событий нажатия кнопки.

Улучшения приветствуются!

#Region "Custom column, cell and edit control for Combobox-with-a-'..'-Button"


Public Class DataGridViewComboBoxExColumn
  Inherits DataGridViewComboBoxColumn
  Public Sub New()
    MyBase.New()
    CellTemplate = New DataGridViewComboBoxExCell()
  End Sub
  Public Overrides Property CellTemplate As DataGridViewCell
    Get
      Return MyBase.CellTemplate
    End Get
    Set(ByVal value As DataGridViewCell)
      If (value IsNot Nothing) AndAlso Not value.GetType().IsAssignableFrom(GetType(DataGridViewComboBoxExCell)) Then
        Throw New InvalidCastException("Must be a DataGridViewComboBoxExCell")
      End If
      MyBase.CellTemplate = value
    End Set
  End Property
End Class

Public Class DataGridViewComboBoxExCell
  Inherits DataGridViewComboBoxCell
  Dim HostingPanel As Panel

  Public Sub New()
    MyBase.New()
    Dim TheButton As Button
    HostingPanel = New Panel
    HostingPanel.BorderStyle = BorderStyle.Fixed3D
    HostingPanel.Padding = New Padding(0, 0, 0, 0)

    HostingPanel.BackColor = Color.FromKnownColor(KnownColor.Control)
    'HostingPanel.ForeColor = Color.Red ' Color.FromKnownColor(KnownColor.ButtonFace)
    TheButton = New Button
    TheButton.Text = ""
    TheButton.BackColor = Color.FromKnownColor(KnownColor.ButtonFace)
    TheButton.ImageList = DaCorFredProtMainForm.MainImageList
    TheButton.ImageKey = "table_edit.png"

    TheButton.Dock = DockStyle.Fill
    HostingPanel.Controls.Add(TheButton)
  End Sub

  Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)
    MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)
    If Not Me.DataGridView.EditingPanel.Controls.Contains(HostingPanel) Then ' Should always be true
      Me.DataGridView.EditingPanel.Controls.Add(HostingPanel)
    End If
  End Sub

  Public Overrides Sub DetachEditingControl()
    If Me.DataGridView.EditingPanel.Controls.Contains(HostingPanel) Then ' Should always be true
      Me.DataGridView.EditingPanel.Controls.Remove(HostingPanel)
    End If
    MyBase.DetachEditingControl()
  End Sub

  Public Overrides ReadOnly Property EditType As Type
    Get
      Return MyBase.EditType
    End Get
  End Property

  Public Overrides ReadOnly Property ValueType As Type
    Get
      Return MyBase.ValueType
    End Get
  End Property

  Public Overrides Function PositionEditingPanel(ByVal cellBounds As System.Drawing.Rectangle, ByVal cellClip As System.Drawing.Rectangle, ByVal cellStyle As System.Windows.Forms.DataGridViewCellStyle, ByVal singleVerticalBorderAdded As Boolean, ByVal singleHorizontalBorderAdded As Boolean, ByVal isFirstDisplayedColumn As Boolean, ByVal isFirstDisplayedRow As Boolean) As System.Drawing.Rectangle
    cellBounds.Width += cellBounds.Height
    cellClip.Width += cellClip.Height
    Return MyBase.PositionEditingPanel(cellBounds, cellClip, cellStyle, singleVerticalBorderAdded, singleHorizontalBorderAdded, isFirstDisplayedColumn, isFirstDisplayedRow)
  End Function

  Public Overrides Sub PositionEditingControl(ByVal setLocation As Boolean, ByVal setSize As Boolean, ByVal cellBounds As System.Drawing.Rectangle, ByVal cellClip As System.Drawing.Rectangle, ByVal cellStyle As System.Windows.Forms.DataGridViewCellStyle, ByVal singleVerticalBorderAdded As Boolean, ByVal singleHorizontalBorderAdded As Boolean, ByVal isFirstDisplayedColumn As Boolean, ByVal isFirstDisplayedRow As Boolean)
    MyBase.PositionEditingControl(setLocation, setSize, cellBounds, cellClip, cellStyle, singleVerticalBorderAdded, singleHorizontalBorderAdded, isFirstDisplayedColumn, isFirstDisplayedRow)
    Me.DataGridView.EditingControl.Width -= Me.DataGridView.EditingPanel.Height
    HostingPanel.Width = Me.DataGridView.EditingPanel.Height
    HostingPanel.Height = Me.DataGridView.EditingPanel.Height
    HostingPanel.Location = New Point(DataGridView.EditingPanel.Size.Width - DataGridView.EditingPanel.Size.Height, 0)
  End Sub
End Class

#End Region
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...