我曾经花了N多时间去尝试,终不得志
后来改用FlexGrid去实现

解决方案 »

  1.   

    改用tdbgrid
    直接替换原来的datagrid
    在属性的value栏中修改就是了
      

  2.   

    Dim adoRecordset As ADODB.Recordset
    Const dY = 20
    Const dX = 10Const WdX = 8
    Const HdY = 10Private Sub Check1_LostFocus()
    Check1.Visible = False
    End SubPrivate Sub Command1_Click()
    Form1.Show vbModal
    End SubPrivate Sub DataGrid1_Click()
    On Error Resume Next
    If Not Check1.Visible Then
           Check1.Move DataGrid1.Left + DataGrid1.Columns(DataGrid1.Col).Left + dX, DataGrid1.Top + DataGrid1.RowTop(DataGrid1.Row) + dY, DataGrid1.Columns(DataGrid1.Col).Width - WdX
           Check1.DataField = adoRecordset.Fields.Item(DataGrid1.Col).Name
           Check1.Visible = True
           'Check1.SetFocus
           
    End If
    End SubPrivate Sub DataGrid1_ColResize(ByVal ColIndex As Integer, Cancel As Integer)
    On Error Resume Next
    'Check1.Width = DataGrid1.Columns(DataGrid1.Col).Width - wdX
    'Check1.Left = DataGrid1.Left + DataGrid1.Columns(DataGrid1.Col).Left + dX
    'Check1.Top = DataGrid1.Top + DataGrid1.RowTop(DataGrid1.Row) + dY
    'Check1.Move DataGrid1.Left + DataGrid1.Columns(DataGrid1.Col).Left + dX, DataGrid1.Top + DataGrid1.RowTop(DataGrid1.Row) + dY, DataGrid1.Columns(DataGrid1.Col).Width - WdX
    Check1.Visible = False
    'Dim temp As Long
    'For i = 0 To DataGrid1.Columns.Count - 1
    '    temp = temp + DataGrid1.Columns.Item(i).Width
    'Next iIf DataGrid1.Columns.Item(DataGrid1.Columns.Count - 1).Left + DataGrid1.Columns.Item(DataGrid1.Columns.Count - 1).Width >= DataGrid1.Width - 270 Then
       Command3.Visible = True
    Else
       Command3.Visible = False
    End If
    End SubPrivate Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
        
        'Check1.Width = DataGrid1.Columns(DataGrid1.Col).Width - wdX
        'Check1.Left = DataGrid1.Left + DataGrid1.Columns(DataGrid1.Col).Left + dX
         
        'Check1.Top = DataGrid1.Top + DataGrid1.RowTop(DataGrid1.Row) + dY
        On Error Resume Next
        Check1.Move DataGrid1.Left + DataGrid1.Columns(DataGrid1.Col).Left + dX, DataGrid1.Top + DataGrid1.RowTop(DataGrid1.Row) + dY, DataGrid1.Columns(DataGrid1.Col).Width - WdX
        Check1.DataField = adoRecordset.Fields.Item(DataGrid1.Col).Name
        Check1.Visible = True
        'Check1.SetFocus
        
        
    End SubPrivate Sub DataGrid1_Scroll(Cancel As Integer)
    Check1.Visible = False
    End SubPrivate Sub DataGrid1_SplitChange()
    'Check1.Visible = False
    End SubPrivate Sub Form_Load()
        Set adoRecordset = New ADODB.Recordset '测试用记录集
        For i = 0 To 3
            adoRecordset.Fields.Append "fld" & i, adBoolean
        Next i
        adoRecordset.Open
        Dim b As Boolean
        For i = 0 To 10
            b = Not (b)
            adoRecordset.AddNew Array("fld0", "fld1", "fld2", "fld3"), Array(b, Not b, b, Not b)
        Next i
        
        
        Set DataGrid1.DataSource = adoRecordset
        
        
        DataGrid1.RowHeight = Check1.Height
        DataGrid1.AllowRowSizing = False
        DataGrid1.AllowUpdate = False
        Check1.Visible = False
        Set Check1.DataSource = adoRecordset
       
        
        Dim bFmt1 As New StdDataFormat
        Dim bFmt2 As New StdDataFormat
        Dim bFmt3 As New StdDataFormat
        
        bFmt1.Type = fmtBoolean
        bFmt1.TrueValue = "√"
        bFmt1.FalseValue = "×"
        Set DataGrid1.Columns(0).DataFormat = bFmt1
        
        bFmt2.Type = fmtBoolean
        bFmt2.TrueValue = "True" '"√"
        bFmt2.FalseValue = "False" '" ×"
        Set DataGrid1.Columns(1).DataFormat = bFmt2
        
        bFmt3.Type = fmtBoolean
        bFmt3.TrueValue = "是" '"√"
        bFmt3.FalseValue = "否" '" ×"
        Set DataGrid1.Columns(2).DataFormat = bFmt3
        DataGrid1.MarqueeStyle = dbgHighlightCell
        DisableDataGridSplit DataGrid1, Command3
    End Sub
    Public Sub DisableDataGridSplit(DataGridX As DataGrid, CommandX As CommandButton)
    CommandX.Move DataGridX.Left + 10, DataGridX.Top + DataGridX.Height - CommandX.Height + 30, 30, 240
    CommandX.TabStop = False
    End Sub
      

  3.   

    下面这个例子    实现了MSFlexGrid  control  中  显示  checkboxes  
      Option  Explicit
      
      Private  Sub  SetRow(ByVal  idx  As  Integer,  ByVal  person_name  As  String,  ByVal  needs_air  As  Boolean,  ByVal  needs_hotel  As  Boolean,  ByVal  needs_car  As  Boolean)
              With  MSFlexGrid1
                      .TextMatrix(idx,  0)  =  person_name
                      .Row  =  idx
      
                      .Col  =  1
                      If  needs_air  Then
                              Set  .CellPicture  =  picChecked.Picture
                      Else
                              Set  .CellPicture  =  picUnchecked.Picture
                      End  If
      
                      .Col  =  2
                      If  needs_hotel  Then
                              Set  .CellPicture  =  picChecked.Picture
                      Else
                              Set  .CellPicture  =  picUnchecked.Picture
                      End  If
      
                      .Col  =  3
                      If  needs_car  Then
                              Set  .CellPicture  =  picChecked.Picture
                      Else
                              Set  .CellPicture  =  picUnchecked.Picture
                      End  If
              End  With
      End  Sub
      Private  Sub  Form_Load()
              With  MSFlexGrid1
                      .BackColor  =  &  HE0E0E0
                      .Rows  =  4
                      .Cols  =  4
                      .FixedCols  =  1
                      .FixedRows  =  1
      
                      .TextMatrix(0,  0)  =  "Name"
                      .TextMatrix(0,  1)  =  "Air"
                      .TextMatrix(0,  2)  =  "Hotel"
                      .TextMatrix(0,  3)  =  "Car"
              End  With
      
              SetRow  1,  "Alice",  True,  True,  False
              SetRow  2,  "Bob",  True,  False,  False
              SetRow  3,  "Carter",  False,  False,  True
      End  Sub
      
      Private  Sub  Form_Resize()
              MSFlexGrid1.Move  0,  0,  ScaleWidth,  ScaleHeight
      End  Sub
      
      
      '  Toggle  the  check  box.
      Private  Sub  MSFlexGrid1_Click()
              If  MSFlexGrid1.Col  <    1  Or  MSFlexGrid1.Row  <    1  Then  Exit  Sub
      
              If  MSFlexGrid1.CellPicture  =  picChecked  Then
                      Set  MSFlexGrid1.CellPicture  =  picUnchecked
              Else
                      Set  MSFlexGrid1.CellPicture  =  picChecked
              End  If
      End  Sub
      

  4.   

    笨方法:
    绑定到TextBox控件上,
    TextBox隐藏。
    ChechBox_Chang()
    if CheckBox.Text="男" then
      TextBox.Text="True"
    ElseIf CheckBox.Text="女" 
      TextBox.Text="False"
    Endif
    end sub
    然后在TextBox_Chang()
    里面写相应的语句。明白?
      

  5.   

    误解为combobox了。
    不过差不多。
    自己看着办吧。
      

  6.   

    误解为combobox了,
    不过思路一样,
    自己弄吧,。
      

  7.   

    非常感激各位!
    我想是我没有说清楚。
    我希望出来的效果是BOOLEAN列全部是CHECKBOX,而不是CLICK之后显示出来。我要实现的功能是:在一个DATAGRID中选定一个或几个记录进行删除或移动,另外一个DATAGRID随之增加或减少相应记录。请大家再作答!!
      

  8.   

    那你就把 sonicdater(发呆呆(我答问题*不吵架*因为我呆)) 的代码改一下。
    用 数组控件, 全部定位到 你指定的 列上去。
      

  9.   

    我也是觉得用load(i)。也没试过,拿位能做个肯定的答复。
    还有有楼上说的,如果有tdbgrid直接绑定一个boolean能否有贴子说的效果。
     
      

  10.   

    Private Sub DataGrid1_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
            Select Case DataGrid1.Col
                Case 0                        Check1.Visible = True
                            Check1.Width = DataGrid1.Columns(DataGrid1.Col).Width + 30
                            Check1.Left = DataGrid1.Left + DataGrid1.Columns(DataGrid1.Col).Left
                            Check1.Top = DataGrid1.Top + DataGrid1.Row * (DataGrid1.RowHeight + hh) + (DataGrid1.HeadLines - 1) * 195
                            Check1.SetFocus
                            If DataGrid1.Columns(9).Text <> "" Then
                                Check1.Value = 1
                            Else
                                Check1.Value = 0
                            End If
                Case Else
                    Check1.Visible = False
            End Select
    End Sub
      

  11.   

    装一个TrueDBGrid控件,什么事都可搞定。
      

  12.   

    在属性中的format中设置列的格式为checkbox,并在columns 中绑定到boolean列。
      

  13.   

    用控件绑定修改是一个不好的习惯,最好自己用标准SQL语句来处理