PDA

View Full Version : Column Type جدید برای datagridview



hooooman
پنج شنبه 05 دی 1398, 16:28 عصر
سلام
من یک Autocompletetextbox سفارشی درست کردم
که خودش بدون مشکل کار میکنه. حالا میخوام اونوبه عنوان یک ستون توی دیتا گرید استفادش کنم . اول اونو به عنوان یک نوع ستون مشخص کردم :



Imports System
Imports System.Windows.Forms
Public Class DatagridviewAutocompleteTextboxColumn
Inherits DataGridViewColumn

Public Sub New()
MyBase.New(New DataGridViewAutocompleteTextBoxCell())
End Sub

Dim _MelocationX As Integer
Dim _MelocationY As Integer
Dim _Desktoplocation As New Point
Dim _HasData As Boolean = False
Dim _FontIsBold As Boolean = False
Dim _RowID As Integer
Dim _MyparentForm As Form
Dim _MeForm As Windows.Forms.Form
Dim _forControl As Control
Dim _DataTableList As New DataTable
Dim _SearchFiledName As String
Dim _DispalyFieldName As String

Public Property MeLocationX As Integer
Get
Return _MelocationX
End Get
Set(value As Integer)
_MelocationX = value
End Set
End Property
Public Property MeLocationY As Integer
Get
Return _MelocationY
End Get
Set(value As Integer)
_MelocationY = value
End Set
End Property
Public Property DesktopLocation As Point
Get
Return Me._Desktoplocation
End Get
Set(value As Point)
Me._Desktoplocation = value
End Set
End Property
Public Property ParentForm As Form
Get
Return Me._MyparentForm
End Get
Set(value As Form)
_MyparentForm = value
Me._MeForm = _MyparentForm
End Set
End Property
Public Property forControl As Control
Get
Return _forControl
End Get
Set(value As Control)
_forControl = value
End Set
End Property

Public ReadOnly Property HasData() As Boolean
Get
Return Me._HasData
End Get
End Property
Public Property DataTableList()
Get
Return Me._DataTableList
End Get
Set(ByVal value)
Me._DataTableList = value
Me._SearchFiledName = Me._DataTableList.Columns(0).ColumnName
Me._DispalyFieldName = Me._DataTableList.Columns(1).ColumnName

End Set
End Property
Public Property RowID()
Get
Return Me._RowID
End Get
Set(ByVal value)
Me._RowID = value
End Set
End Property
Public Property FontIsBols() As Boolean
Get
Return Me._FontIsBold
End Get
Set(ByVal value As Boolean)
Me._FontIsBold = value
End Set
End Property


Public Overrides Function Clone() As Object
Dim col As DatagridviewAutocompleteTextboxColumn = CType(MyBase.Clone(), DatagridviewAutocompleteTextboxColumn)
Return col
End Function


Public Overrides Property CellTemplate() As DataGridViewCell
Get
Return MyBase.CellTemplate
End Get
Set(ByVal value As DataGridViewCell)
If Not TypeOf value Is DataGridViewAutocompleteTextBoxCell Then
Throw New InvalidCastException("DataGridViewAutocompleteTextBoxCell" + "")
End If
MyBase.CellTemplate = value
End Set
End Property

End Class
Public Class DataGridViewAutocompleteTextBoxCell
Inherits DataGridViewTextBoxCell

Public Sub New()
End Sub

Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)

MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)

Dim autocomplete As DataGridViewAutocompleteTextBoxEditingControl =
Me.DataGridView.EditingControl
If Not (autocomplete Is Nothing) Then
' maskedBox.Text = IIf(Me.Value Is Nothing, "", Me.Value.ToString())
Dim column As DatagridviewAutocompleteTextboxColumn = Me.OwningColumn
'If Not (column Is Nothing) Then
' maskedBox.Mask = column.Mask
'End If
End If
End Sub
Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType(DataGridViewAutocompleteTextBoxEditingCont rol)
End Get
End Property
Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(Object)
End Get
End Property
Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return MyBase.DefaultNewRowValue
End Get
End Property
End Class
Public Class DataGridViewAutocompleteTextBoxEditingControl
Inherits AutoCompleteTextBoxSample.AutoCompleteTextbox
Implements IDataGridViewEditingControl
Private dataGridView As DataGridView
Private rowIndex As Integer
Private valueChanged As Boolean

Public Sub New()
Me.TabStop = False
End Sub

Public Function GetEditingControlFormattedValue(
ByVal context As DataGridViewDataErrorContexts) As Object _
Implements IDataGridViewEditingControl.GetEditingControlForma ttedValue

Return Me.Text
End Function

Public Property EditingControlFormattedValue() As Object _
Implements IDataGridViewEditingControl.EditingControlFormatte dValue
Get
Return Me.GetEditingControlFormattedValue(
DataGridViewDataErrorContexts.Formatting)
End Get
Set(ByVal value As Object)
Me.Text = CStr(value)
End Set
End Property
Public Sub ApplyCellStyleToEditingControl(
ByVal dataGridViewCellStyle As DataGridViewCellStyle) _
Implements IDataGridViewEditingControl.ApplyCellStyleToEditin gControl

Me.TextAlign = HorizontalAlignment.Left
Me.Font = dataGridViewCellStyle.Font
Me.ForeColor = dataGridViewCellStyle.ForeColor
Me.BackColor = dataGridViewCellStyle.BackColor
End Sub
Public Property EditingControlDataGridView() As DataGridView _
Implements IDataGridViewEditingControl.EditingControlDataGrid View
Get
Return Me.dataGridView
End Get
Set(ByVal value As DataGridView)
Me.dataGridView = value
End Set
End Property
Public Property EditingControlRowIndex() As Integer _
Implements IDataGridViewEditingControl.EditingControlRowIndex
Get
Return Me.rowIndex
End Get
Set(ByVal value As Integer)
Me.rowIndex = value
End Set
End Property

Public Property EditingControlValueChanged() As Boolean _
Implements IDataGridViewEditingControl.EditingControlValueCha nged
Get
Return Me.valueChanged
End Get
Set(ByVal value As Boolean)
Me.valueChanged = value
End Set
End Property
Public Function EditingControlWantsInputKey(ByVal keyData As Keys,
ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
Implements IDataGridViewEditingControl.EditingControlWantsInp utKey

Select Case keyData And Keys.KeyCode
Case Keys.Right, Keys.End, Keys.Left, Keys.Home
Return True
Case Else
Return False
End Select
End Function
Public ReadOnly Property EditingPanelCursor() As Cursor _
Implements IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property
Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
Implements IDataGridViewEditingControl.PrepareEditingControlF orEdit

If selectAll Then
Me.SelectAll()
Else
Me.SelectionStart = Me.TextLength
End If
End Sub
Public ReadOnly Property RepositionEditingControlOnValueChange() _
As Boolean _
Implements _
IDataGridViewEditingControl.RepositionEditingContr olOnValueChange
Get
Return False
End Get
End Property
Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
MyBase.OnTextChanged(e)
Me.valueChanged = True
Me.dataGridView.NotifyCurrentCellDirty(True)
End Sub
End Class










بعدش با استفاده از :



Private Sub MyDataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles MyDataGridView1.EditingControlShowing

Dim AutocompletePerson As AutoCompleteTextBoxSample.AutoCompleteTextbox = TryCast(e.Control, AutoCompleteTextBoxSample.AutoCompleteTextbox)

Dim dt As New DataTable
dt = clsPerson.PersonAutocomplete
For Each dr As DataRow In dt.Rows
source.Add(dr("fldname"))
Next
AutocompletePerson.AutoCompleteList = source
End Sub




اونو توی دیتاگرید استفاده می کنم . درست کار میکنه فقط یک مشکل داره با کلیدهای بالا و پایین . ینی وقتی لیست باز میشه که ازش انتخاب بکنم و کلید های بالا و پایین رو میزنم لیست بسته میشه و و دوباره روی سلول دیتا گرید میاد .
چیکارش کنم که وقتی لیست باز میشه تا کلید اینتر برای انتخاب از لیست یا کلید esc برای صرفنظر رو نزدم بسته نشه؟

the king
پنج شنبه 05 دی 1398, 18:57 عصر
سلام
من یک Autocompletetextbox سفارشی درست کردم
که خودش بدون مشکل کار میکنه. حالا میخوام اونوبه عنوان یک ستون توی دیتا گرید استفادش کنم . اول اونو به عنوان یک نوع ستون مشخص کردم :



Imports System
Imports System.Windows.Forms
Public Class DatagridviewAutocompleteTextboxColumn
Inherits DataGridViewColumn

Public Sub New()
MyBase.New(New DataGridViewAutocompleteTextBoxCell())
End Sub

Dim _MelocationX As Integer
Dim _MelocationY As Integer
Dim _Desktoplocation As New Point
Dim _HasData As Boolean = False
Dim _FontIsBold As Boolean = False
Dim _RowID As Integer
Dim _MyparentForm As Form
Dim _MeForm As Windows.Forms.Form
Dim _forControl As Control
Dim _DataTableList As New DataTable
Dim _SearchFiledName As String
Dim _DispalyFieldName As String

Public Property MeLocationX As Integer
Get
Return _MelocationX
End Get
Set(value As Integer)
_MelocationX = value
End Set
End Property
Public Property MeLocationY As Integer
Get
Return _MelocationY
End Get
Set(value As Integer)
_MelocationY = value
End Set
End Property
Public Property DesktopLocation As Point
Get
Return Me._Desktoplocation
End Get
Set(value As Point)
Me._Desktoplocation = value
End Set
End Property
Public Property ParentForm As Form
Get
Return Me._MyparentForm
End Get
Set(value As Form)
_MyparentForm = value
Me._MeForm = _MyparentForm
End Set
End Property
Public Property forControl As Control
Get
Return _forControl
End Get
Set(value As Control)
_forControl = value
End Set
End Property

Public ReadOnly Property HasData() As Boolean
Get
Return Me._HasData
End Get
End Property
Public Property DataTableList()
Get
Return Me._DataTableList
End Get
Set(ByVal value)
Me._DataTableList = value
Me._SearchFiledName = Me._DataTableList.Columns(0).ColumnName
Me._DispalyFieldName = Me._DataTableList.Columns(1).ColumnName

End Set
End Property
Public Property RowID()
Get
Return Me._RowID
End Get
Set(ByVal value)
Me._RowID = value
End Set
End Property
Public Property FontIsBols() As Boolean
Get
Return Me._FontIsBold
End Get
Set(ByVal value As Boolean)
Me._FontIsBold = value
End Set
End Property


Public Overrides Function Clone() As Object
Dim col As DatagridviewAutocompleteTextboxColumn = CType(MyBase.Clone(), DatagridviewAutocompleteTextboxColumn)
Return col
End Function


Public Overrides Property CellTemplate() As DataGridViewCell
Get
Return MyBase.CellTemplate
End Get
Set(ByVal value As DataGridViewCell)
If Not TypeOf value Is DataGridViewAutocompleteTextBoxCell Then
Throw New InvalidCastException("DataGridViewAutocompleteTextBoxCell" + "")
End If
MyBase.CellTemplate = value
End Set
End Property

End Class
Public Class DataGridViewAutocompleteTextBoxCell
Inherits DataGridViewTextBoxCell

Public Sub New()
End Sub

Public Overrides Sub InitializeEditingControl(ByVal rowIndex As Integer, ByVal initialFormattedValue As Object, ByVal dataGridViewCellStyle As DataGridViewCellStyle)

MyBase.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle)

Dim autocomplete As DataGridViewAutocompleteTextBoxEditingControl =
Me.DataGridView.EditingControl
If Not (autocomplete Is Nothing) Then
' maskedBox.Text = IIf(Me.Value Is Nothing, "", Me.Value.ToString())
Dim column As DatagridviewAutocompleteTextboxColumn = Me.OwningColumn
'If Not (column Is Nothing) Then
' maskedBox.Mask = column.Mask
'End If
End If
End Sub
Public Overrides ReadOnly Property EditType() As Type
Get
Return GetType(DataGridViewAutocompleteTextBoxEditingCont rol)
End Get
End Property
Public Overrides ReadOnly Property ValueType() As Type
Get
Return GetType(Object)
End Get
End Property
Public Overrides ReadOnly Property DefaultNewRowValue() As Object
Get
Return MyBase.DefaultNewRowValue
End Get
End Property
End Class
Public Class DataGridViewAutocompleteTextBoxEditingControl
Inherits AutoCompleteTextBoxSample.AutoCompleteTextbox
Implements IDataGridViewEditingControl
Private dataGridView As DataGridView
Private rowIndex As Integer
Private valueChanged As Boolean

Public Sub New()
Me.TabStop = False
End Sub

Public Function GetEditingControlFormattedValue(
ByVal context As DataGridViewDataErrorContexts) As Object _
Implements IDataGridViewEditingControl.GetEditingControlForma ttedValue

Return Me.Text
End Function

Public Property EditingControlFormattedValue() As Object _
Implements IDataGridViewEditingControl.EditingControlFormatte dValue
Get
Return Me.GetEditingControlFormattedValue(
DataGridViewDataErrorContexts.Formatting)
End Get
Set(ByVal value As Object)
Me.Text = CStr(value)
End Set
End Property
Public Sub ApplyCellStyleToEditingControl(
ByVal dataGridViewCellStyle As DataGridViewCellStyle) _
Implements IDataGridViewEditingControl.ApplyCellStyleToEditin gControl

Me.TextAlign = HorizontalAlignment.Left
Me.Font = dataGridViewCellStyle.Font
Me.ForeColor = dataGridViewCellStyle.ForeColor
Me.BackColor = dataGridViewCellStyle.BackColor
End Sub
Public Property EditingControlDataGridView() As DataGridView _
Implements IDataGridViewEditingControl.EditingControlDataGrid View
Get
Return Me.dataGridView
End Get
Set(ByVal value As DataGridView)
Me.dataGridView = value
End Set
End Property
Public Property EditingControlRowIndex() As Integer _
Implements IDataGridViewEditingControl.EditingControlRowIndex
Get
Return Me.rowIndex
End Get
Set(ByVal value As Integer)
Me.rowIndex = value
End Set
End Property

Public Property EditingControlValueChanged() As Boolean _
Implements IDataGridViewEditingControl.EditingControlValueCha nged
Get
Return Me.valueChanged
End Get
Set(ByVal value As Boolean)
Me.valueChanged = value
End Set
End Property
Public Function EditingControlWantsInputKey(ByVal keyData As Keys,
ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
Implements IDataGridViewEditingControl.EditingControlWantsInp utKey

Select Case keyData And Keys.KeyCode
Case Keys.Right, Keys.End, Keys.Left, Keys.Home
Return True
Case Else
Return False
End Select
End Function
Public ReadOnly Property EditingPanelCursor() As Cursor _
Implements IDataGridViewEditingControl.EditingPanelCursor
Get
Return MyBase.Cursor
End Get
End Property
Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
Implements IDataGridViewEditingControl.PrepareEditingControlF orEdit

If selectAll Then
Me.SelectAll()
Else
Me.SelectionStart = Me.TextLength
End If
End Sub
Public ReadOnly Property RepositionEditingControlOnValueChange() _
As Boolean _
Implements _
IDataGridViewEditingControl.RepositionEditingContr olOnValueChange
Get
Return False
End Get
End Property
Protected Overrides Sub OnTextChanged(ByVal e As EventArgs)
MyBase.OnTextChanged(e)
Me.valueChanged = True
Me.dataGridView.NotifyCurrentCellDirty(True)
End Sub
End Class










بعدش با استفاده از :



Private Sub MyDataGridView1_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles MyDataGridView1.EditingControlShowing

Dim AutocompletePerson As AutoCompleteTextBoxSample.AutoCompleteTextbox = TryCast(e.Control, AutoCompleteTextBoxSample.AutoCompleteTextbox)

Dim dt As New DataTable
dt = clsPerson.PersonAutocomplete
For Each dr As DataRow In dt.Rows
source.Add(dr("fldname"))
Next
AutocompletePerson.AutoCompleteList = source
End Sub




اونو توی دیتاگرید استفاده می کنم . درست کار میکنه فقط یک مشکل داره با کلیدهای بالا و پایین . ینی وقتی لیست باز میشه که ازش انتخاب بکنم و کلید های بالا و پایین رو میزنم لیست بسته میشه و و دوباره روی سلول دیتا گرید میاد .
چیکارش کنم که وقتی لیست باز میشه تا کلید اینتر برای انتخاب از لیست یا کلید esc برای صرفنظر رو نزدم بسته نشه؟


کد اون AutoCompleteTextbox رو نمی بینم. داخل کلاسش برای ProcessCmdKey مشخص کنید که این دو تا کلید رو خودم میخوام پردازش کنم تا اونها رو تحویل DataGridView نده.

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
Select case keyData
Case Keys.Up
' your code
Return True
Case Keys.Down
' your code
Return True
End Select
Return MyBase.ProcessCmdKey(msg, keyData)
End Function