2015-06-21 179 views
1

我使用DataGridView和来自TableAdapter的DataSource并添加了5个未绑定的列,其类型为DataGridViewCheckBoxColumn从DataGridView中的多行复选框中只选择一个复选框

它们分别是: “lima”, “empat”, “tiga”, “dua”, “satu

我需要做的,则选择复选框 “利马” 的时候,同一行中,其余复选框未选中成为或仅可在同一行

在这里,在选择一个复选框是我在CellValueChanged事件写下:

Private Sub DataGridView3_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView3.CellValueChanged 
     If DataGridView3.CurrentRow IsNot Nothing Then 
      Dim SelectedColumnName = DataGridView3.Columns(DataGridView3.CurrentCellValue.ColumnIndex).Name 

      If e.ColumnIndex = DataGridView3.Columns("lima").Index OrElse _ 
       e.ColumnIndex = DataGridView3.Columns("empat").Index OrElse _ 
       e.ColumnIndex = DataGridView3.Columns("tiga").Index OrElse _ 
       e.ColumnIndex = DataGridView3.Columns("dua").Index OrElse _ 
       e.ColumnIndex = DataGridView3.Columns("satu").Index Then 

       Dim Row = CType((CType(DataGridView3.DataSource.Current, DataRowView)).Row, DataRow) 

       If SelectedColumnName = "lima" Then 
        If DataGridView3.CurrentRowCellValue("lima") = "True" Then 
         Row.Item("empat") = False 
         Row.Item("tiga") = False 
         Row.Item("dua") = False 
         Row.Item("satu") = False 
        End If 

        'and so..on 

       ElseIf SelectedColumnName = "satu" Then 
        If DataGridView3.CurrentRowCellValue("satu") = "True" Then 
         Row.Item("lima") = False 
         Row.Item("empat") = False 
         Row.Item("tiga") = False 
         Row.Item("dua") = False 
        End If 

       End If 

       DataGridView3.CurrentCell = DataGridView3(e.ColumnIndex, e.RowIndex) 
      End If 
      End If 

    End Sub 

这是福在模块

<System.Diagnostics.DebuggerStepThrough()> _ 
<Runtime.CompilerServices.Extension()> _ 
Function CurrentRowCellValue(ByVal sender As DataGridView, ByVal ColumnName As String) As String 
    Dim Result As String = "" 
    If Not sender.Rows(sender.CurrentRow.Index).Cells(ColumnName).Value Is Nothing Then 
     Result = sender.Rows(sender.CurrentRow.Index).Cells(ColumnName).Value.ToString 
    End If 
    Return Result 
End Function 

<System.Diagnostics.DebuggerStepThrough()> _ 
<Runtime.CompilerServices.Extension()> _ 
Function CurrentCellValue(ByVal sender As DataGridView) As DataGridViewCell 
    Return sender(sender.Columns(sender.CurrentCell.ColumnIndex).Index, sender.CurrentRow.Index) 
End Function 

nctions为CurrentCellCurrentRowCellValue,这是从CurrentCellDirtyStateChanged事件

Private Sub DataGridView3_CurrentCellDirtyStateChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DataGridView3.CurrentCellDirtyStateChanged 
    If TypeOf DataGridView3.CurrentCell Is DataGridViewCheckBoxCell Then 
     DataGridView3.CommitEdit(DataGridViewDataErrorContexts.Commit) 
    End If 
End Sub 

我已经在DataGridView的只读属性设置为False。问题是,我仍然可以检查同一行中的所有复选框。

http://oi57.tinypic.com/2hr0qbk.jpg

有人可以给什么我做错了这里的建议?

感谢

回答

1

一些提示:表中没有:

  • this linkcheckBoxs
  • 如果他们是未绑定列,则无法通过DataSource.Current行更改值工作时,有关CellValuechanged事件定义为利马,empat,...

此变通办法(使用CellContentClick)对我的作品(无需扩展方法和CurrentCellDirtyStateChanged事件):


Private Sub DataGridView1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView3.CellContentClick 

     Dim checkboxIndexes As New List(Of Integer) 
     checkboxIndexes.Add(DataGridView3.Columns("lima").Index) 
     checkboxIndexes.Add(DataGridView3.Columns("empat").Index) 
     checkboxIndexes.Add(DataGridView3.Columns("tiga").Index) 
     checkboxIndexes.Add(DataGridView3.Columns("dua").Index) 
     checkboxIndexes.Add(DataGridView3.Columns("satu").Index) 

     If checkboxIndexes.Contains(e.ColumnIndex) Then 
     'check for false value because event occurs before row is validated 
      If DataGridView3.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = False Then 
       For Each index In checkboxIndexes 
        If index <> e.ColumnIndex Then 
         DataGridView3.Rows(e.RowIndex).Cells(index).Value = False 
        End If 
       Next 
      End If 
     End If 
    End Sub 
+0

是的,它这样工作...!感谢您的代码和链接参考:) –

+0

@SylvieYunjae欢迎您 – Chris

0

我做了改进,以便之前添加的代码去实现我在不同的检查同一行的复选框的目标列。这个对我有用。

Private Sub Grilla_CellClick(sender As Object, e As Telerik.WinControls.UI.GridViewCellEventArgs) Handles Grilla.CellClick 

    Dim checkboxIndexes As New List(Of Integer) 
    checkboxIndexes.Add(Grilla.Columns("Select").Index) 
    checkboxIndexes.Add(Grilla.Columns("Select1").Index) 


    If checkboxIndexes.Contains(e.ColumnIndex) Then 
     'check for false value because event occurs before row is validated 
     If Grilla.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = False Then 
      For Each index In checkboxIndexes 
       If index <> e.ColumnIndex Then 
        'Do nothing here 
       Else 
        If Grilla.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = False Then 
         Grilla.Rows(e.RowIndex).Cells(index).Value = True 
        Else 
         Grilla.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = False 
        End If 

       End If 
      Next 

     Else 

      If Grilla.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = True Then 
       For Each index In checkboxIndexes 
        If index <> e.ColumnIndex Then 
         'Do nothing here 
        Else 
         If Grilla.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = False Then 
          Grilla.Rows(e.RowIndex).Cells(index).Value = True 
         Else 
          Grilla.Rows(e.RowIndex).Cells(e.ColumnIndex).Value = False 
         End If 

        End If 
       Next 
      End If 

     End If 
    End If 

    Grilla.TableElement.Update(GridUINotifyAction.DataChanged) 

End Sub 
+0

请问您能简单解释一下改进吗? –

+0

对不起,如果我没有足够清楚,我的意思是我适应了我的需要,这些是能够检查和取消选中,在这种情况下,在他们之间独立的同一行中的2个复选框。 – Julian

+0

这是OP的问题的答案吗? –