2017-04-02 28 views
1

出于某种原因,我有问题试图从数据网格组合框单元格中获取值。这是我单击按钮时得到的错误:vb.net 2015年:如何从datagridviewcomboboxcell获取价值?

System.ArgumentOutOfRangeException:'索引超出范围。必须是非负面的,并且小于收藏的大小。“

我试图通过引用行和列以及组合框名称来获取值。

我敢肯定,这是对你最容易解决,所以任何帮助,将不胜感激:-)

我删除了标签和文本框的代码,因为他们工作正常,并没有想要使代码不再需要。

Imports System.Windows.Forms 

Public Class Custom_Tab_Page 
Inherits TabPage 

Private dynamic_Button As New Button 
Private cdgv As New DataGridView 
Private gridComboBoxDays As New DataGridViewComboBoxCell 
Private dynamic_Tab_Page As New TabPage 

Public Sub New(ByVal name As String) 
    Me.Text = name 

    INITIALIZE_TEXTBOX() 
    INITIALIZE_BUTTON() 
    InitializetDataGridView() 

End Sub 

Protected Sub INITIALIZE_BUTTON() 
    dynamic_Button = New Button 
    With dynamic_Button 
     .Top = 10 
     .Left = 190 
     .Visible = True 
     .AutoSize = True 
     .Text = "Calculate" 
     AddHandler .Click, AddressOf Button_Click 
    End With 

    Me.Controls.Add(dynamic_Button) 

End Sub 

Protected Sub Button_Click(ByVal sender As Object, ByVal e As EventArgs) 

    If dynamic_Label IsNot Nothing Then 
     With dynamic_Textbox 
      .Text = cdgv.Rows(0).Cells(0).Value 
     End With 
    End If 
End Sub 

Private Sub InitializetDataGridView() 

    Dim cdgv = New DataGridView() 
    With cdgv 
     .Top = 200 
     .Left = 200 
     .RowHeadersVisible = False 
     .ColumnCount = 3 
     .RowCount = 2 
     .ScrollBars = ScrollBars.None 
     .ColumnHeadersHeight = 63 
     .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None 
     .AllowUserToAddRows = False 
     .RowsDefaultCellStyle.NullValue = 0.ToString 
    End With 

    Dim gridComboBoxDays = New DataGridViewComboBoxCell 
    For x As Integer = 0 To 31 
     gridComboBoxDays.Items.Add(x.ToString) 'Populate the Combobox 
    Next 

    Dim gridComboBoxHours As New DataGridViewComboBoxCell 
    For x As Integer = 0 To 23 
     gridComboBoxHours.Items.Add(x.ToString) 'Populate the Combobox 
    Next 

    Dim gridComboBoxMinutes As New DataGridViewComboBoxCell 
    For x As Integer = 0 To 59 
     gridComboBoxMinutes.Items.Add(x.ToString) 'Populate the Combobox 
    Next 

    For Loop_Counter As Integer = 0 To cdgv.ColumnCount - 1 
     cdgv.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 
     cdgv.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter 
     cdgv.Columns(Loop_Counter).Width = 65 
    Next 
    ' 
    ' Set The header values based on units selected 
    ' 
    cdgv.Columns(0).HeaderCell.Value = "Time Since" & vbCrLf & "Last Flight" & vbCrLf & "(days)" 
    cdgv.Columns(1).HeaderCell.Value = "Time Since" & vbCrLf & "Last Flight" & vbCrLf & "(hours)" 
    cdgv.Columns(2).HeaderCell.Value = "Time Since" & vbCrLf & "Last Flight" & vbCrLf & "(minutes)" 
    ' 
    ' Set the overall height And width of the dgv_Gases_Used 
    ' 
    cdgv.Width = cdgv.Columns(0).Width + cdgv.Columns(1).Width + cdgv.Columns(2).Width + 3 
    cdgv.Height = cdgv.RowCount * cdgv.RowTemplate.Height + cdgv.ColumnHeadersHeight 
    ' 

    cdgv.Item(0, 0) = gridComboBoxDays 
    cdgv.Item(1, 0) = gridComboBoxHours 
    cdgv.Item(2, 0) = gridComboBoxMinutes 

    Me.Controls.Add(cdgv) 

End Sub 
End Class 

回答

0

您必须添加一些验证

If dynamic_Label IsNot Nothing AnAlso 
    cdgv.Rows.Count > 0 Then 

    With dynamic_Textbox 

     If not cdgv.Rows(0).Cells(0) is Nothing Then 

      .Text = cdgv.Rows(0).Cells(0).Value 

     Else 

      .Text = "" 

     End If 

    End With 

End If 

编辑1

阅读您的评论之后,我认为你必须检查你所添加的dataGridViewComboboxCell到DataGridView的方式,如何从中读取。

以下一些有用的链接:

设置一个DataGridViewComboBoxCell

读数值从DataGridViewComboBoxCell

也许你应该使用SelectedValue代替Value

+0

哈迪,即采取了错误消息的照顾,但它不r即使在我从组合框中选择一个数字时也会产生一个值。 – Rob

+0

@Rob我会检查它 – Hadi

+0

@Rob我更新了我的答案,并添加了一些有用的链接,希望这个帮助你 – Hadi