By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
458,127 Members | 1,343 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 458,127 IT Pros & Developers. It's quick & easy.

how to add two value in combobox using datagrid?

P: n/a
i have successfully added a combobox to my datagrid by setting their
datasource from one of my table. here's my code...

Dim grdColStyle6 As New DataGridComboBoxColumn()
With grdColStyle6
.MappingName = "MajorID" 'must be from the grid
table...
.HeaderText = "Major"
.Width = 120
.ColumnComboBox.DataSource =
DsStudentCourse1.Tables("Major").DefaultView 'dv;
.ColumnComboBox.DisplayMember = "Major"
.ColumnComboBox.ValueMember = "MajorID"

grdTableStyle1.PreferredRowHeight =
..ColumnComboBox.Height + 2
End With

my problem is that i need to add a combobox that contains only two
value called "1st" and "2nd" that when i click the combobox the value
"1st" and "2nd" will appear. so this value is not taken from a table.
i want this only to put in my code...

i tried this code...

With grdColStyle4
.MappingName = "Year" 'must be from the grid table...
.HeaderText = "Year"
.Width = 75

.ColumnComboBox.Items.Add("1st")
.ColumnComboBox.Items.Add("2nd")
.ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDown
grdTableStyle1.PreferredRowHeight =
..ColumnComboBox.Height + 2
End With

but it gives me an error...

An unhandled exception of type 'System.NullReferenceException'
occurred in system.windows.forms.dll

Additional information: Object reference not set to an instance of an
object.
any help is greatly appreciated...
Nov 20 '05 #1
Share this Question
Share on Google+
5 Replies


P: n/a
Hi,

If you only want the user to be able to select 1st or 2nd the
combobox drop down style should be set to dropdownlist. As for the
'System.NullReferenceException' you probably have an error in the combobox
column. Post the code for the datagridcomboboxcolumn.

Ken
---------------
"jaYPee" <hi******@yahoo.com> wrote in message
news:nf********************************@4ax.com...
i have successfully added a combobox to my datagrid by setting their
datasource from one of my table. here's my code...

Dim grdColStyle6 As New DataGridComboBoxColumn()
With grdColStyle6
.MappingName = "MajorID" 'must be from the grid
table...
.HeaderText = "Major"
.Width = 120
.ColumnComboBox.DataSource =
DsStudentCourse1.Tables("Major").DefaultView 'dv;
.ColumnComboBox.DisplayMember = "Major"
.ColumnComboBox.ValueMember = "MajorID"

grdTableStyle1.PreferredRowHeight =
.ColumnComboBox.Height + 2
End With

my problem is that i need to add a combobox that contains only two
value called "1st" and "2nd" that when i click the combobox the value
"1st" and "2nd" will appear. so this value is not taken from a table.
i want this only to put in my code...

i tried this code...

With grdColStyle4
.MappingName = "Year" 'must be from the grid table...
.HeaderText = "Year"
.Width = 75

.ColumnComboBox.Items.Add("1st")
.ColumnComboBox.Items.Add("2nd")
.ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDown
grdTableStyle1.PreferredRowHeight =
.ColumnComboBox.Height + 2
End With

but it gives me an error...

An unhandled exception of type 'System.NullReferenceException'
occurred in system.windows.forms.dll

Additional information: Object reference not set to an instance of an
object.
any help is greatly appreciated...

Nov 20 '05 #2

P: n/a
thanks for the reply. here is the code of datagridcomboboxcolumn

Option Strict Off
Option Explicit On

Imports Microsoft.VisualBasic
Imports System
Imports System.ComponentModel
Imports System.Data
Imports System.Data.Common
Imports System.Data.OleDb
Imports System.Drawing
Imports System.Windows.Forms

Namespace DataGridTextBoxCombo
' Step 1. Derive a custom column style from DataGridTextBoxColumn
' a) add a ComboBox member
' b) track when the combobox has focus in Enter and Leave events
' c) override Edit to allow the ComboBox to replace the TextBox
' d) override Commit to save the changed data
Public Class DataGridComboBoxColumn
Inherits DataGridTextBoxColumn
Public ColumnComboBox As NoKeyUpCombo
Private _source As System.Windows.Forms.CurrencyManager
Private _rowNum As Integer
Private _isEditing As Boolean
Public Shared _RowCount As Integer
Public Sub New()
_source = Nothing
_isEditing = False
_RowCount = -1

ColumnComboBox = New NoKeyUpCombo()
ColumnComboBox.DropDownStyle = ComboBoxStyle.DropDownList

AddHandler ColumnComboBox.Leave, AddressOf LeaveComboBox
AddHandler ColumnComboBox.SelectionChangeCommitted,
AddressOf ComboStartEditing
End Sub 'New

Private Sub HandleScroll(ByVal sender As Object, ByVal e As
EventArgs)
If ColumnComboBox.Visible Then
ColumnComboBox.Hide()
End If
End Sub 'HandleScroll

Private Sub ComboStartEditing(ByVal sender As Object, ByVal e
As EventArgs)
_isEditing = True
MyBase.ColumnStartedEditing(sender)
End Sub 'ComboMadeCurrent
Private Sub LeaveComboBox(ByVal sender As Object, ByVal e As
EventArgs)
If _isEditing Then
SetColumnValueAtRow(_source, _rowNum,
ColumnComboBox.Text)
_isEditing = False
Invalidate()

End If
ColumnComboBox.Hide()
AddHandler Me.DataGridTableStyle.DataGrid.Scroll, New
EventHandler(AddressOf HandleScroll)
End Sub 'LeaveComboBox
Protected Overloads Overrides Sub Edit(ByVal [source] As
System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal
bounds As System.Drawing.Rectangle, ByVal [readOnly] As Boolean, ByVal
instantText As String, ByVal cellIsVisible As Boolean)

MyBase.Edit([source], rowNum, bounds, [readOnly],
instantText, cellIsVisible)

_rowNum = rowNum
_source = [source]

ColumnComboBox.Parent = Me.TextBox.Parent
ColumnComboBox.Location = Me.TextBox.Location
ColumnComboBox.Size = New Size(Me.TextBox.Size.Width,
ColumnComboBox.Size.Height)
ColumnComboBox.SelectedIndex =
ColumnComboBox.FindStringExact(Me.TextBox.Text)
ColumnComboBox.Text = Me.TextBox.Text
Me.TextBox.Visible = False
ColumnComboBox.Visible = True
AddHandler Me.DataGridTableStyle.DataGrid.Scroll,
AddressOf HandleScroll

ColumnComboBox.BringToFront()
ColumnComboBox.Focus()
End Sub 'Edit
Protected Overrides Function Commit(ByVal dataSource As
System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer) As
Boolean

If _isEditing Then
_isEditing = False
SetColumnValueAtRow(dataSource, rowNum,
ColumnComboBox.Text)
End If
Return True
End Function 'Commit
Protected Overrides Sub ConcedeFocus()
Console.WriteLine("ConcedeFocus")
MyBase.ConcedeFocus()
End Sub 'ConcedeFocus

Protected Overrides Function GetColumnValueAtRow(ByVal
[source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As
Integer) As Object

Dim s As Object = MyBase.GetColumnValueAtRow([source],
rowNum)
Dim dv As DataView = CType(Me.ColumnComboBox.DataSource,
DataView)
Dim rowCount As Integer = dv.Count
Dim i As Integer = 0
Dim s1 As Object

'if things are slow, you could order your dataview
'& use binary search instead of this linear one
While i < rowCount
s1 = dv(i)(Me.ColumnComboBox.ValueMember)
If (Not s1 Is DBNull.Value) AndAlso _
(Not s Is DBNull.Value) AndAlso _
s = s1 Then
Exit While
End If
i = i + 1
End While

If i < rowCount Then
Return dv(i)(Me.ColumnComboBox.DisplayMember)
End If
Return DBNull.Value
End Function 'GetColumnValueAtRow
Protected Overrides Sub SetColumnValueAtRow(ByVal [source] As
System.Windows.Forms.CurrencyManager, ByVal rowNum As Integer, ByVal
value As Object)
Dim s As Object = value

Dim dv As DataView = CType(Me.ColumnComboBox.DataSource,
DataView)
Dim rowCount As Integer = dv.Count
Dim i As Integer = 0
Dim s1 As Object

'if things are slow, you could order your dataview
'& use binary search instead of this linear one
While i < rowCount
s1 = dv(i)(Me.ColumnComboBox.DisplayMember)
If (Not s1 Is DBNull.Value) AndAlso _
s = s1 Then
Exit While
End If
i = i + 1
End While
If i < rowCount Then
s = dv(i)(Me.ColumnComboBox.ValueMember)
Else
s = DBNull.Value
End If
MyBase.SetColumnValueAtRow([source], rowNum, s)
End Sub 'SetColumnValueAtRow
End Class 'DataGridComboBoxColumn
End Namespace

Nov 20 '05 #3

P: n/a
Hi,

If the combobox isn't bound to a dataview this GetColumnValueAtRow
will fail. Try something like this.
Protected Overrides Function GetColumnValueAtRow(ByVal
[source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As
Integer) As Object

Dim s As Object = MyBase.GetColumnValueAtRow([source],
rowNum)
Try
Dim dv As DataView = CType(Me.ColumnComboBox.DataSource,
DataView)
catch
return s
end try
Dim rowCount As Integer = dv.Count
Dim i As Integer = 0
Dim s1 As Object

'if things are slow, you could order your dataview
'& use binary search instead of this linear one
While i < rowCount
s1 = dv(i)(Me.ColumnComboBox.ValueMember)
If (Not s1 Is DBNull.Value) AndAlso _
(Not s Is DBNull.Value) AndAlso _
s = s1 Then
Exit While
End If
i = i + 1
End While

If i < rowCount Then
Return dv(i)(Me.ColumnComboBox.DisplayMember)
End If
Return DBNull.Value
End Function 'GetColumnValueAtRow

Ken
-----------------------
Nov 20 '05 #4

P: n/a
thanks you once again for the reply. i'll try your code tomorow..

thanks once again...

jaYPee
On Sat, 24 Apr 2004 06:38:14 -0400, "Ken Tucker [MVP]"
<vb***@bellsouth.net> wrote:
Hi,

If the combobox isn't bound to a dataview this GetColumnValueAtRow
will fail. Try something like this.
Protected Overrides Function GetColumnValueAtRow(ByVal
[source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As
Integer) As Object

Dim s As Object = MyBase.GetColumnValueAtRow([source],
rowNum)
Try
Dim dv As DataView = CType(Me.ColumnComboBox.DataSource,
DataView)
catch
return s
end try
Dim rowCount As Integer = dv.Count
Dim i As Integer = 0
Dim s1 As Object

'if things are slow, you could order your dataview
'& use binary search instead of this linear one
While i < rowCount
s1 = dv(i)(Me.ColumnComboBox.ValueMember)
If (Not s1 Is DBNull.Value) AndAlso _
(Not s Is DBNull.Value) AndAlso _
s = s1 Then
Exit While
End If
i = i + 1
End While

If i < rowCount Then
Return dv(i)(Me.ColumnComboBox.DisplayMember)
End If
Return DBNull.Value
End Function 'GetColumnValueAtRow

Ken
-----------------------


Nov 20 '05 #5

P: n/a
i tried your code but i get same error...this is really because the
combobox is not bound to a dataview or is not a lookup table

On Sat, 24 Apr 2004 06:38:14 -0400, "Ken Tucker [MVP]"
<vb***@bellsouth.net> wrote:
Hi,

If the combobox isn't bound to a dataview this GetColumnValueAtRow
will fail. Try something like this.
Protected Overrides Function GetColumnValueAtRow(ByVal
[source] As System.Windows.Forms.CurrencyManager, ByVal rowNum As
Integer) As Object

Dim s As Object = MyBase.GetColumnValueAtRow([source],
rowNum)
Try
Dim dv As DataView = CType(Me.ColumnComboBox.DataSource,
DataView)
catch
return s
end try
Dim rowCount As Integer = dv.Count
Dim i As Integer = 0
Dim s1 As Object

'if things are slow, you could order your dataview
'& use binary search instead of this linear one
While i < rowCount
s1 = dv(i)(Me.ColumnComboBox.ValueMember)
If (Not s1 Is DBNull.Value) AndAlso _
(Not s Is DBNull.Value) AndAlso _
s = s1 Then
Exit While
End If
i = i + 1
End While

If i < rowCount Then
Return dv(i)(Me.ColumnComboBox.DisplayMember)
End If
Return DBNull.Value
End Function 'GetColumnValueAtRow

Ken
-----------------------


Nov 20 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.