一般VB作界面大多属于以下几种情况:http://www.yippeesoft.com控件分开布局,不重叠;使用SSTAB控件分开重叠的控件;用FRAME等控件作为容器,用VISIBLE控制分别显示。
可是昨天我却遇到了这种情况:
界面需要显示、编辑一个数据库的表,http://www.yippeesoft.com我在工程1中开始进行测试,比较使用DBGRID、LISTVIEW以及MSFLEXGID控件的显示效果。我先添加了这三种控件,经过一番比较,觉得还是MSFLEXGRID控件比较友好,虽然它不能进行编辑,但是我记得在MSDN中有过这方面的例子,网上也很多这种例子,就是通过动态移动一个TEXTBOX控件完成编辑功能。于是我又放置了一个TEXTBOX控件,经过一番调试,简化了部分代码完成了http://www.yippeesoft.com这项功能。
代码如下:
Private Sub MSFlexGrid1_Click()
i = MSFlexGrid1.Col
j = MSFlexGrid1.Row
With MSFlexGrid1 http://www.yippeesoft.com
text1.Move .Left + .CellLeft, .Top + .CellTop, .CellWidth, .CellHeight
text1.Text = .Text
text1.Visible = True
http://www.yippeesoft.com text1.SetFocus
End With
End Sub
Private Sub text1_LostFocus()
http://www.yippeesoft.com If i = 0 Or j = 0 Then
Exit Sub
End If
MSFlexGrid1.TextMatrix(j, i) = text1.Text
text1.Visible = False
End Sub
以上http://www.yippeesoft.com代码非常简单,不多做解释了。
请注意以下几点:
1、许多例子使用的是EnterCell或者KEYPRESS事件中显示TEXTBOX和LeaveCell事件中更新数据,隐藏TEXTBOX,但是根据我的调试,发现当使用ENTERCELL事件时,第一次第一个网格总是不能点击激活,因为该事件是指示当前活动单元更改到一个不同单元时发生,而MSFLEXGRID获得焦点后,默认活动单元就是第一个网格了;至于使用KEYPRESS事件,如果界面上不止一个控件,还是得先用鼠标点击激活MSFLEXGRID控件,用户再敲一个按键似乎有http://www.yippeesoft.com点多余;使用LEAVECELL事件时,如果先在编辑状态,然后用鼠标调整MSFLEXGRID控件的网格大小,此时TEXTBOX仍然显示并大小固定,与网格不匹配,所以使用TEXTBOX的LOSTFOCUS事件,一旦TEXTBOX失去焦点,立即更新数据并隐藏,以避免界面不美观。
2、定义变量I,J保存MSFLEXGRID控件的行、列并不是多余的,如果你用MSFlexGrid1.Text = text1.Text代码代替MSFlexGrid1.TextMatrix(j, i) = text1.Text就能够非常明显得看到差别:明明我在上一网格更改了内容,点击到下一网格后,http://www.yippeesoft.com上一网格的内容没有改变,而当前网格上显示的TEXTBOX内容却是更改的上一网格的内容,这时因为先点击MSFLEXGRID控件,当前激活的网格已经切换了,这时再激发LOSTFOCUS事件更新内容自然不匹配了。至于判断为0不执行更新,那时因为我需要显示一些固定表头内容,如果不作判断,会把表头也更新了。
经过一番调试,觉得使用MSFLEXGRID控件没有什么问题了,我就打开我的工作工程,准备增加新的功能模块。
先添加一个TEXTBOX控件,http://www.yippeesoft.com然后添加新部件,添加一个MSFLEXGRID控件,界面布局、添加代码,运行,这下完蛋了,无论怎么样点击鼠标,就是看不见TEXTBOX了,我以为是控件属性问题,因为我在调试时更改了MSFLEXGRID一些属性,逐个对比设置成一致,仍然不行;删除控件,重新添加,还是不行,我从测试工程拷贝MSFLEXGRID控件过来就一切正常,正常添加就是不成功,但是明明TEXTBOX位置已经移动过去了,就是不显示出来。
我又重新新建一个测试工程,http://www.yippeesoft.com随便放了一个TEXTBOX,又放了一个MSFLEXGRID盖在上面,依然如故,难道真的不行了,我无意识的按着“CTRL+X”、“CTRL+V”,想如果实在不行,就用LISTVIEW算了,按下F5最后运行一次,随便点击了一个网格,居然又可以了,天啊!什么毛病!我仔细观察界面,发现原来被盖住的TEXTBOX这次显示在上面,不再盖住了。这下恍然大悟了。原来我开始作测试时,因为比较显示效果,先添加的MSFLEXGRID,而后来我因为方便,先加了TEXTBOX,两者地差异导致界面上两个控件的顺序不一样。
VB的菜单格式-顺序,http://www.yippeesoft.com以前倒是用来调试多层界面层叠布局,可以把盖在下面的控件移动到最上面来或者相反,当时还查了一下MSDN,认识了相应的ZORDER方法(大部分控件都会有这个方法,可是用的最少的估计也是它了),http://www.yippeesoft.com由于我一次只需要显示一层,所以也没有留意,这次可是被它害惨了。
最后得出三个解决方法:
1、格式-顺序,把TEXTBOX移至顶层,http://www.yippeesoft.com或者把MSFLEXGRID移至底层,保证TEXTBOX在最上面。
2、在FORM_LOAD中添加MSFlexGrid1.ZOrder (1)或者http://www.yippeesoft.comTEXT1. ZOrder (0)
3、“CTRL+X”、“CTRL+V”:)
历史博文
- Hosting Office in a WPF - 2010
- 20080723 c# directshow - 2009
- 20070628 skyeye uclinux make exe ok 2 - 2008
- 1002 USBPHONE 资料 检测 - 2007
- 0119 LINUX REDHAT9 OPENSSL LIBSSL 资料 - 2006