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.Collections
'Namespace Hamster.Common
'/ Implementation of a ComboBox as a column in a DataGrid
Public Class DataGridComboBoxColumn
Inherits DataGridColumnStyle
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="dataSource">The datasource that contains the lookup
table</param>
'/ <param name="displayMember">The member of the lookuptable to
display</param>
'/ <param name="valueMember">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.Visible = False
_comboBox.DataSource = dataSource
_dataTable = dataSource
_comboBox.DisplayMember = displayMember
_displayMember = displayMember
_valueMember = valueMember
_comboBox.ValueMember = valueMember
_comboBox.DropDownStyle = ComboBoxStyle.DropDownList
Dim _graphicsContext As Graphics = dataGrid.CreateGraphics()
Dim _widest As Single = 0
Dim _stringSize As New SizeF(0, 0)
Dim dr As DataRow
For Each dr In dataSource.Rows
_stringSize = _graphicsContext.MeasureString(dr(displayMember).T oString(),
dataGrid.Font)
If _stringSize.Width _widest Then
_widest = _stringSize.Width
End If
Next dr
_comboBox.DropDownWidth = CInt(Math.Ceiling(_widest))
Me.Width = _comboBox.DropDownWidth + 25 ' Add the space for the dropdown
arrow
Me.MappingName = colName
Me.HeaderText = colName
dataGrid.Controls.Add(_comboBox)
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="dataSource"></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.SelectedValue
If NullText.Equals(_value) Then
_value = System.Convert.DBNull
End If
Me.SetColumnValueAtRow(dataSource, 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="instantText"></param>
'/ <param name="cellIsVisible"></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.Bounds = bounds
_comboBox.Visible = True
'_comboBox.BringToFront();
'_comboBox.Focus();
_comboBox.SelectedValue = GetText(GetColumnValueAtRow([source], rowNum))
If Not (instantText Is Nothing) Then
_comboBox.SelectedValue = instantText
Dim [End] As Integer = _comboBox.Text.Length
_comboBox.Select([End], 0)
Else
_comboBox.SelectAll()
End If
'this.DataGridTableStyle.DataGrid.Invalidate(Origi nalBounds);
'_comboBox.BringToFront();
_inEdit = True
End Sub 'Edit
'/ Standard override
'/ <returns></returns>
Protected Overrides Function GetMinimumHeight() As Integer
Return _comboBox.PreferredHeight + _yMargin
End Function 'GetMinimumHeight
'/ Standard override
'/ <param name="g"></param>
'/ <param name="val"></param>
Protected Overrides Function GetPreferredHeight(ByVal g As Graphics, ByVal
val As Object) As Integer
Return FontHeight + _yMargin
End Function 'GetPreferredHeight
'/ Standard override
'/ <param name="g"></param>
'/ <param name="val"></param>
Protected Overrides Function GetPreferredSize(ByVal g As Graphics, ByVal val
As Object) As Size
Dim _extents As Size = Size.Ceiling(g.MeasureString(GetText(val),
Me.DataGridTableStyle.DataGrid.Font))
_extents.Width += _xMargin * 2
_extents.Height += _yMargin
Return _extents
End Function 'GetPreferredSize
'/ 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="alignToRight"></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(GetColumnValueAtRow([source], rowNum))
Dim dr As DataRow
For Each dr In _dataTable.Rows
If dr(_valueMember).ToString() = _text Then
_text = dr(_displayMember).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.DataGridTableStyle.BackColor)
Dim _foreBrush = New SolidBrush(Me.DataGridTableStyle.ForeColor)
Dim _rect As Rectangle = bounds
Dim _rectF As RectangleF = RectangleF.op_Implicit(_rect) 'Konverterar från
Rectangle till RectangleF
Dim _format As New StringFormat
If alignToRight Then
_format.FormatFlags = StringFormatFlags.DirectionRightToLeft
End If
Select Case Me.Alignment
Case HorizontalAlignment.Left
_format.Alignment = StringAlignment.Near
Case HorizontalAlignment.Right
_format.Alignment = StringAlignment.Far
Case HorizontalAlignment.Center
_format.Alignment = StringAlignment.Center
End Select
_format.FormatFlags = StringFormatFlags.NoWrap
g.FillRectangle(_backBrush, _rect)
_rect.Offset(0, _yMargin)
_rect.Height -= _yMargin
g.DrawString([text], Me.DataGridTableStyle.DataGrid.Font, _foreBrush,
_rectF, _format)
_format.Dispose()
End Sub 'PaintText
Private Function GetText(ByVal val As Object) As String
If val Is System.DBNull.Value 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 'DataGridComboBoxColumn
'End Namespace 'Hamster.Common
-------------------------------------------------------------
'Imports Hamster.Common
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim ts As New DataGridTableStyle
ts.MappingName = "Columns"
Dim AccessDataTypes As New DataTable
AccessDataTypes.Columns.Add(New DataColumn("Number", GetType(Integer)))
AccessDataTypes.Columns.Add(New DataColumn("Name", GetType(String)))
AccessDataTypes.Rows.Add(New Object() {3, "Numeric"})
AccessDataTypes.Rows.Add(New Object() {130, "Text"})
Dim c1 As New DataGridComboBoxColumn("Type", AccessDataTypes, "Name",
"Number", theGrid)
c1.NullText = "3"
ts.GridColumnStyles.Add(c1)
End Sub
End Class