以下程序如果没有*的部分可以正确显示,多了*的部分运行显示不正确!
请测试后解答,分不够可以加! fg2为mshflexgrid 例如4行11列 测试时第一次debug的cellleft居然相等!!!Dim i As Integer
Dim objTxt() As TextBox
Dim objOpt() As CheckBox
ReDim objTxt(Fg2.Rows - 1)
ReDim objOpt(Fg2.Rows - 1)For i = 1 To Fg2.Rows - 1
Fg2.row = i Set objTxt(i - 1) = Me.Controls.Add("vb.textbox", "txt" & i)
With objTxt(i - 1)
Fg2.Col = 8
.Text = Fg2
.Move Fg2.Left + Fg2.CellLeft, Fg2.Top + Fg2.CellTop, Fg2.CellWidth, Fg2.CellHeight
.Visible = True
.BackColor = vbYellow
.ZOrder 0 '显示在上层
Debug.Print "celltxt" & i & ":"; Fg2.CellLeft
End With
'****************************************************************
Set objOpt(i - 1) = Me.Controls.Add("vb.checkbox", "chk" & i)
With objOpt(i - 1)
Fg2.Col = 9
.Caption = Fg2
If Fg2.TextArray(Fgi(i, 9)) = "已付" Then .Value = 1 Else .Value = 0
.Move Fg2.Left + Fg2.CellLeft, Fg2.Top + Fg2.CellTop, Fg2.CellWidth, Fg2.CellHeight
.Visible = True
.BackColor = vbYellow
.ZOrder 0
Debug.Print "cellopt" & i & ":"; Fg2.CellLeft
End With
'*****************************************************************
Next i
请测试后解答,分不够可以加! fg2为mshflexgrid 例如4行11列 测试时第一次debug的cellleft居然相等!!!Dim i As Integer
Dim objTxt() As TextBox
Dim objOpt() As CheckBox
ReDim objTxt(Fg2.Rows - 1)
ReDim objOpt(Fg2.Rows - 1)For i = 1 To Fg2.Rows - 1
Fg2.row = i Set objTxt(i - 1) = Me.Controls.Add("vb.textbox", "txt" & i)
With objTxt(i - 1)
Fg2.Col = 8
.Text = Fg2
.Move Fg2.Left + Fg2.CellLeft, Fg2.Top + Fg2.CellTop, Fg2.CellWidth, Fg2.CellHeight
.Visible = True
.BackColor = vbYellow
.ZOrder 0 '显示在上层
Debug.Print "celltxt" & i & ":"; Fg2.CellLeft
End With
'****************************************************************
Set objOpt(i - 1) = Me.Controls.Add("vb.checkbox", "chk" & i)
With objOpt(i - 1)
Fg2.Col = 9
.Caption = Fg2
If Fg2.TextArray(Fgi(i, 9)) = "已付" Then .Value = 1 Else .Value = 0
.Move Fg2.Left + Fg2.CellLeft, Fg2.Top + Fg2.CellTop, Fg2.CellWidth, Fg2.CellHeight
.Visible = True
.BackColor = vbYellow
.ZOrder 0
Debug.Print "cellopt" & i & ":"; Fg2.CellLeft
End With
'*****************************************************************
Next i
Function Fgi(r As Integer, c As Integer) As Integer
Fgi = c + Fg2.Cols * r
End Function
让Fg2的width能够一次显示出所有列就没有问题了
即Fg2的宽度不够
提个建议:
1.建议利用scroll事件,让文本框可以跟随网格一起滚动
2.利用leftcol,toprow属性,控制文本框的visible
3.我倾向于用colpos和rowpos属性给文本框定位,因为利用这两个属性不需要移动单元格
Dim i As Integer
Dim objTxt() As TextBox
Dim objOpt() As CheckBoxReDim objTxt(fg2.Rows - 1)
ReDim objOpt(fg2.Rows - 1)For i = 1 To fg2.Rows
fg2.Row = i - 1 Set objTxt(i - 1) = Me.Controls.Add("vb.textbox", "txt" & i)
With objTxt(i - 1)
fg2.Col = 8
.Text = fg2
.Move fg2.Left + fg2.CellLeft, fg2.Top + fg2.CellTop, fg2.CellWidth, fg2.CellHeight
.Visible = True
.BackColor = vbYellow
.ZOrder 0 '显示在上层
Debug.Print "celltxt" & i & ":"; fg2.CellLeft
End With
'****************************************************************
Set objOpt(i - 1) = Me.Controls.Add("vb.checkbox", "chk" & i)
With objOpt(i - 1)
fg2.Col = 9
.Caption = fg2
If fg2.TextArray(9 + fg2.Cols * (i - 1)) = "已付" Then .Value = 1 Else .Value = 0
.Move fg2.Left + fg2.CellLeft, fg2.Top + fg2.CellTop, fg2.CellWidth, fg2.CellHeight
.Visible = True
.BackColor = vbYellow
.ZOrder 0
Debug.Print "cellopt" & i & ":"; fg2.CellLeft
End With '*****************************************************************
Next
End Sub
'调整后的程序 msflexgrid是行标号是从0 开始的
'已经测试过了
Fg2.row = i '在我的程序中 'R' 为 'r' Fg2.Row = i '在我的程序中 'R' 为 'R'费解啊!
Fg2.row = i '在我的程序中 'R' 为 'r' Fg2.Row = i '在你的程序中 'R' 为 'R'
scroll下拉时怎么控制文本框的visible?分不够可以加! 谢谢
如果是的话那是因为msflexgrid的行标号是从0开始的所以你要把 Fg2.row = i改为 fg2.Row = i - 1
至于 "你知道怎么用rowpos 和 colpos 定位文本框吗"我觉的你的方法就可以rowpos 和 colpos 是msflexgrid的属性
With MSFlexGrid1
c = .Col: r = .RowText1.Left = .Left + .ColPos(c)
Text1.Top = .Top + .RowPos(r)
Text1.Width = .ColWidth(c)
Text1.Height = .RowHeight(r)
Text1 = .Text
Text1.Visible = True
Text1.SetFocus
这样定义文本矿的位置.
文本矿本身没有rowpos 和 colpos 属性
经测试 第一次运行时第一个文本框跟检测框重叠了