Hi
I have downloaded some code and tried it and nothing happens with the
datagrid. Explain what is wrong and what I have to do please. I have tried
to Import the namespace Hamster and it didn't work. Explain what I have to
do to make that work.
Fia
Imports System
Imports System.Windows. Forms
Imports System.Drawing
Imports System.Data
Imports System.Collecti ons
'Namespace Hamster.Common
'/ Implementation of a ComboBox as a column in a DataGrid
Public Class DataGridComboBo xColumn
Inherits DataGridColumnS tyle
Private _xMargin As Integer = 2
Private _yMargin As Integer = 1
Private _comboBox As ComboBox
Private _oldValue As String = ""
Private _inEdit As Boolean = False
Private _dataTable As DataTable
Private _displayMember, _valueMember As String
'/ <param name="colName"> The name of the column</param>
'/ <param name="dataSourc e">The datasource that contains the lookup
table</param>
'/ <param name="displayMe mber">The member of the lookuptable to
display</param>
'/ <param name="valueMemb er">The member of the lookuptable with the
value</param>
'/ <param name="dataGrid" >The datagrid parent of this column</param>
Public Sub New(ByVal colName As String, ByVal dataSource As DataTable, ByVal
displayMember As String, ByVal valueMember As String, ByVal dataGrid As
DataGrid)
_comboBox = New ComboBox
_comboBox.Visib le = False
_comboBox.DataS ource = dataSource
_dataTable = dataSource
_comboBox.Displ ayMember = displayMember
_displayMember = displayMember
_valueMember = valueMember
_comboBox.Value Member = valueMember
_comboBox.DropD ownStyle = ComboBoxStyle.D ropDownList
Dim _graphicsContex t As Graphics = dataGrid.Create Graphics()
Dim _widest As Single = 0
Dim _stringSize As New SizeF(0, 0)
Dim dr As DataRow
For Each dr In dataSource.Rows
_stringSize = _graphicsContex t.MeasureString (dr(displayMemb er).ToString(),
dataGrid.Font)
If _stringSize.Wid th _widest Then
_widest = _stringSize.Wid th
End If
Next dr
_comboBox.DropD ownWidth = CInt(Math.Ceili ng(_widest))
Me.Width = _comboBox.DropD ownWidth + 25 ' Add the space for the dropdown
arrow
Me.MappingName = colName
Me.HeaderText = colName
dataGrid.Contro ls.Add(_comboBo x)
End Sub 'New
'/ Standard override
'/ <param name="rowNum"></param>
Protected Overrides Sub Abort(ByVal rowNum As Integer)
_inEdit = False
_comboBox.Hide( )
End Sub 'Abort
'/ Standard override
'/ <param name="dataSourc e"></param>
'/ <param name="rowNum"></param>
Protected Overrides Function Commit(ByVal dataSource As CurrencyManager ,
ByVal rowNum As Integer) As Boolean
If Not _inEdit Then
Return True
End If
Try
Dim _value As Object = _comboBox.Selec tedValue
If NullText.Equals (_value) Then
_value = System.Convert. DBNull
End If
Me.SetColumnVal ueAtRow(dataSou rce, rowNum, _value)
Catch
Finally
_inEdit = False
_comboBox.Hide( )
End Try
Return True
End Function 'Commit
'/ Standard override
'/ <param name="source"></param>
'/ <param name="rowNum"></param>
'/ <param name="bounds"></param>
'/ <param name="readOnly" ></param>
'/ <param name="instantTe xt"></param>
'/ <param name="cellIsVis ible"></param>
Protected Overloads Overrides Sub Edit(ByVal [source] As CurrencyManager ,
ByVal rowNum As Integer, ByVal bounds As Rectangle, ByVal [readOnly] As
Boolean, ByVal instantText As String, ByVal cellIsVisible As Boolean)
_comboBox.Text = ""
Dim _originalBounds As Rectangle = bounds
_oldValue = _comboBox.Text
If Not cellIsVisible Then
Return
End If
bounds.Offset(_ xMargin, _yMargin)
bounds.Width -= _xMargin * 2
bounds.Height -= _yMargin
_comboBox.Bound s = bounds
_comboBox.Visib le = True
'_comboBox.Brin gToFront();
'_comboBox.Focu s();
_comboBox.Selec tedValue = GetText(GetColu mnValueAtRow([source], rowNum))
If Not (instantText Is Nothing) Then
_comboBox.Selec tedValue = instantText
Dim [End] As Integer = _comboBox.Text. Length
_comboBox.Selec t([End], 0)
Else
_comboBox.Selec tAll()
End If
'this.DataGridT ableStyle.DataG rid.Invalidate( OriginalBounds) ;
'_comboBox.Brin gToFront();
_inEdit = True
End Sub 'Edit
'/ Standard override
'/ <returns></returns>
Protected Overrides Function GetMinimumHeigh t() As Integer
Return _comboBox.Prefe rredHeight + _yMargin
End Function 'GetMinimumHeig ht
'/ Standard override
'/ <param name="g"></param>
'/ <param name="val"></param>
Protected Overrides Function GetPreferredHei ght(ByVal g As Graphics, ByVal
val As Object) As Integer
Return FontHeight + _yMargin
End Function 'GetPreferredHe ight
'/ Standard override
'/ <param name="g"></param>
'/ <param name="val"></param>
Protected Overrides Function GetPreferredSiz e(ByVal g As Graphics, ByVal val
As Object) As Size
Dim _extents As Size = Size.Ceiling(g. MeasureString(G etText(val),
Me.DataGridTabl eStyle.DataGrid .Font))
_extents.Width += _xMargin * 2
_extents.Height += _yMargin
Return _extents
End Function 'GetPreferredSi ze
'/ Standard override
'/ <param name="g"></param>
'/ <param name="bounds"></param>
'/ <param name="source"></param>
'/ <param name="rowNum"></param>
Protected Overloads Overrides Sub Paint(ByVal g As Graphics, ByVal bounds As
Rectangle, ByVal [source] As CurrencyManager , ByVal rowNum As Integer)
Paint(g, bounds, [source], rowNum, False)
End Sub 'Paint
'/ Standard override
'/ <param name="g"></param>
'/ <param name="bounds"></param>
'/ <param name="source"></param>
'/ <param name="rowNum"></param>
'/ <param name="alignToRi ght"></param>
Protected Overloads Overrides Sub Paint(ByVal g As Graphics, ByVal bounds As
Rectangle, ByVal [source] As CurrencyManager , ByVal rowNum As Integer, ByVal
alignToRight As Boolean)
Dim _text As String = GetText(GetColu mnValueAtRow([source], rowNum))
Dim dr As DataRow
For Each dr In _dataTable.Rows
If dr(_valueMember ).ToString() = _text Then
_text = dr(_displayMemb er).ToString()
Exit For
End If
Next dr
PaintText(g, bounds, _text, alignToRight)
End Sub 'Paint
' Helper functions
Private Sub PaintText(ByVal g As Graphics, ByVal bounds As Rectangle, ByVal
[text] As String, ByVal alignToRight As Boolean)
Dim _backBrush = New SolidBrush(Me.D ataGridTableSty le.BackColor)
Dim _foreBrush = New SolidBrush(Me.D ataGridTableSty le.ForeColor)
Dim _rect As Rectangle = bounds
Dim _rectF As RectangleF = RectangleF.op_I mplicit(_rect) 'Konverterar från
Rectangle till RectangleF
Dim _format As New StringFormat
If alignToRight Then
_format.FormatF lags = StringFormatFla gs.DirectionRig htToLeft
End If
Select Case Me.Alignment
Case HorizontalAlign ment.Left
_format.Alignme nt = StringAlignment .Near
Case HorizontalAlign ment.Right
_format.Alignme nt = StringAlignment .Far
Case HorizontalAlign ment.Center
_format.Alignme nt = StringAlignment .Center
End Select
_format.FormatF lags = StringFormatFla gs.NoWrap
g.FillRectangle (_backBrush, _rect)
_rect.Offset(0, _yMargin)
_rect.Height -= _yMargin
g.DrawString([text], Me.DataGridTabl eStyle.DataGrid .Font, _foreBrush,
_rectF, _format)
_format.Dispose ()
End Sub 'PaintText
Private Function GetText(ByVal val As Object) As String
If val Is System.DBNull.V alue Then
Return Me.NullText
End If
If Not (val Is Nothing) Then
Return val.ToString()
Else
Return String.Empty
End If
End Function 'GetText
End Class 'DataGridComboB oxColumn
'End Namespace 'Hamster.Common
-------------------------------------------------------------
'Imports Hamster.Common
Public Class Form1
Inherits System.Windows. Forms.Form
Private Sub Form1_Load(ByVa l sender As Object, ByVal e As System.EventArg s)
Handles MyBase.Load
Dim ts As New DataGridTableSt yle
ts.MappingName = "Columns"
Dim AccessDataTypes As New DataTable
AccessDataTypes .Columns.Add(Ne w DataColumn("Num ber", GetType(Integer )))
AccessDataTypes .Columns.Add(Ne w DataColumn("Nam e", GetType(String) ))
AccessDataTypes .Rows.Add(New Object() {3, "Numeric"})
AccessDataTypes .Rows.Add(New Object() {130, "Text"})
Dim c1 As New DataGridComboBo xColumn("Type", AccessDataTypes , "Name",
"Number", theGrid)
c1.NullText = "3"
ts.GridColumnSt yles.Add(c1)
End Sub
End Class