Oppure

Loading
15/05/12 10:18
nibbio1971
Buongiorno,

ambiente visual studio 2008, VB.NET
sto "discutendo" con uno user control, che funziona perfettamente quando è inserito in una form come details, ma non funziona quando è inserito in una datagrid view. Lo user control ha due caselle di testo, una per il dato e una che calcola la lunghezza del dato.
Se trascino dalla mia datasource lo user control sulla form, tutto funziona
Se uso una datagrdview e imposto il tipo colonna a al mio user control
1) non vedo le due caselle di testo, bensì una sola
2) quando entro in modifica, non riporta il valore del dato

non capisco cosa sbaglio e sto cercando ormai da giorni.

Grazie

Lorenzo

Posto il codice del designer dello user control e il codice



<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class myUserControlTest
  Inherits System.Windows.Forms.UserControl

  'UserControl1 overrides dispose to clean up the component list.
  <System.Diagnostics.DebuggerNonUserCode()> _
  Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    Try
      If disposing AndAlso components IsNot Nothing Then
        components.Dispose()
      End If
    Finally
      MyBase.Dispose(disposing)
    End Try
  End Sub

  'Required by the Windows Form Designer
  Private components As System.ComponentModel.IContainer

  'NOTE: The following procedure is required by the Windows Form Designer
  'It can be modified using the Windows Form Designer.  
  'Do not modify it using the code editor.
  <System.Diagnostics.DebuggerStepThrough()> _
  Private Sub InitializeComponent()
    Me.ilMioDato = New System.Windows.Forms.TextBox
    Me.ilMioRisultato = New System.Windows.Forms.TextBox
    Me.SuspendLayout()
    '
    'ilMioDato
    '
    Me.ilMioDato.Location = New System.Drawing.Point(0, 0)
    Me.ilMioDato.Name = "ilMioDato"
    Me.ilMioDato.Size = New System.Drawing.Size(185, 20)
    Me.ilMioDato.TabIndex = 0
    '
    'ilMioRisultato
    '
    Me.ilMioRisultato.Enabled = False
    Me.ilMioRisultato.Location = New System.Drawing.Point(191, 0)
    Me.ilMioRisultato.Name = "ilMioRisultato"
    Me.ilMioRisultato.Size = New System.Drawing.Size(189, 20)
    Me.ilMioRisultato.TabIndex = 1
    '
    'myUserControlTest
    '
    Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    Me.Controls.Add(Me.ilMioRisultato)
    Me.Controls.Add(Me.ilMioDato)
    Me.Name = "myUserControlTest"
    Me.Size = New System.Drawing.Size(383, 22)
    Me.ResumeLayout(False)
    Me.PerformLayout()

  End Sub
  Friend WithEvents ilMioDato As System.Windows.Forms.TextBox
  Friend WithEvents ilMioRisultato As System.Windows.Forms.TextBox

End Class





<System.ComponentModel.DefaultBindingProperty("Text")> _
Public Class myUserControlTest

  Public Overrides Property Text() As String
    Get
      Return Me.ilMioDato.Text
    End Get
    Set(ByVal value As String)
      Me.ilMioDato.Text = value
    End Set
  End Property

  Private Sub ilMioDato_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ilMioDato.TextChanged
    Me.ilMioRisultato.Text = Me.ilMioDato.Text.Length
  End Sub
End Class

Public Class NDC
  Inherits DataGridViewTextBoxCell
  Public Overrides ReadOnly Property EditType() As System.Type
    Get
      Return GetType(myUserControlTest_DGVColumnType)
    End Get
  End Property

  Public Overrides ReadOnly Property ValueType() As System.Type
    Get
      Return GetType(String)
    End Get
  End Property

End Class

Public Class myUserControlTest_WithCalendarDGVColumn
  Inherits DataGridViewColumn
  Public Sub New()
    MyBase.new(New NDC)
  End Sub



  ' ---> KKKKK
  Public Overrides Property CellTemplate() As DataGridViewCell
    Get
      Return MyBase.CellTemplate
    End Get
    Set(ByVal value As DataGridViewCell)

      ' Ensure that the cell used for the template is a NDC.
      If (value IsNot Nothing) AndAlso _
          Not value.GetType().IsAssignableFrom(GetType(NDC)) _
          Then
        Throw New InvalidCastException("Must be a NDC")
      End If
      MyBase.CellTemplate = value

    End Set
  End Property
  ' <--- KKKKK

End Class


Class myUserControlTest_DGVColumnType
  'this is the new class to get your usercontrol into the datagridcolumn class
  'here your have to change only the first line i.e inherits tbnumber to inherit 'your user control. Remianing all codes are for datagridview to track the keys 'and values. you need not change anything

  Inherits myUserControlTest


  ' (this usercontrol is for getting numeric input only)
  ' You can get this code for this class in my other thread

  ' here after you need not change any code

  Implements IDataGridViewEditingControl

  Private _dataGridView As DataGridView
  Private _rowIndex As Integer
  Private _valueChanged As Boolean

  Public Sub ApplyCellStyleToEditingControl(ByVal dataGridViewCellStyle As DataGridViewCellStyle) _
      Implements IDataGridViewEditingControl.ApplyCellStyleToEditingControl

    Me.BackColor = dataGridViewCellStyle.BackColor
    Me.Font = dataGridViewCellStyle.Font
    Me.ForeColor = dataGridViewCellStyle.ForeColor
  End Sub

  Public Property EditingControlDataGridView() As DataGridView _
      Implements IDataGridViewEditingControl.EditingControlDataGridView
    Get
      Return _dataGridView
    End Get
    Set(ByVal value As DataGridView)
      _dataGridView = value
    End Set
  End Property

  Public Property EditingControlFormattedValue() As Object _
      Implements IDataGridViewEditingControl.EditingControlFormattedValue
    Get
      Return Text
    End Get
    Set(ByVal value As Object)
      Text = value.ToString()
    End Set
  End Property


  Public Property EditingControlRowIndex() As Integer _
      Implements IDataGridViewEditingControl.EditingControlRowIndex
    Get
      Return _rowIndex
    End Get
    Set(ByVal value As Integer)
      _rowIndex = value
    End Set
  End Property

  Public Property EditingControlValueChanged() As Boolean _
      Implements IDataGridViewEditingControl.EditingControlValueChanged
    Get
      Return _valueChanged
    End Get
    Set(ByVal value As Boolean)
      _valueChanged = value
    End Set
  End Property


  Public Function EditingControlWantsInputKey(ByVal keyData As Keys, ByVal dataGridViewWantsInputKey As Boolean) As Boolean _
      Implements IDataGridViewEditingControl.EditingControlWantsInputKey

    Return True
  End Function

  Public ReadOnly Property EditingPanelCursor() As Cursor _
      Implements IDataGridViewEditingControl.EditingPanelCursor
    Get
      Return MyBase.Cursor
    End Get
  End Property


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

    Return Text
  End Function

  Public Sub PrepareEditingControlForEdit(ByVal selectAll As Boolean) _
      Implements IDataGridViewEditingControl.PrepareEditingControlForEdit
  End Sub


  Public ReadOnly Property RepositionEditingControlOnValueChange() As Boolean _
      Implements IDataGridViewEditingControl.RepositionEditingControlOnValueChange
    Get
      Return False
    End Get
  End Property

  Protected Overrides Sub OnTextChanged(ByVal e As System.EventArgs)
    MyBase.OnTextChanged(e)
    _valueChanged = True
    _dataGridView.NotifyCurrentCellDirty(True)
  End Sub

End Class






aaa