找回密码
 立即注册

QQ登录

只需一步,快速开始

BELL_DL

新手上路

1

主题

4

帖子

39

积分

新手上路

积分
39
  • 35

    金币

  • 主题

  • 帖子

最新发帖
BELL_DL
新手上路   /  发表于:2011-6-16 14:36  /   查看:6886  /  回复:5
编辑了一个3列多行添加的列表,当第一列输入不为空的数据后,会自动追加一个新行。当光标落到新行任意列中需要校验上一行的三列是否有空值存在,如果有将光标定义到该单元格,目前遇到的问题是光标无法定义到出问题的单元格里面,还请帮忙!谢谢!

5 个回复

倒序浏览
neil
论坛元老   /  发表于:2011-6-16 16:03:00
沙发
通过制定Multirow的CurrentCellPosition属性。 可以指定焦点的位置。

你只需要指定到空值的Cell上就行了。


另外,针对你的具体情况,我们觉得,使用Validator来做更合适。
在设计器中,给你要校验的Cell的Validators属性里面添加一个RequireFieldValidator,  这个Validator是专门校验空值的。
然后给这个RequireFieldValidator的Actions属性添加一个Action,  并把Reason改为RowValidating。

具体的设置情况根据你的需要,请参考帮助文档
回复 使用道具 举报
BELL_DL
新手上路   /  发表于:2011-6-16 16:58:00
板凳
非常感谢您的回复,目前遇到的问题是CurrentCellPosition中怎么样才能自由的定位置,该属性在CellValidated中实现,如果mlrView.CurrentCellPosition = New GrapeCity.Win.MultiRow.CellPosition(1, 1)就会出现问题程序废掉,请帮忙看一下,谢谢!
主要想实现的功能就是,当同行第二列输入完成无论你的鼠标点向何处,只要是同行第三列为空,就必须的把光标落在第三列中,直至输入完成。需要说明的是第三列是DropDown,还请帮忙解决一下,不胜感激!
回复 使用道具 举报
neil
论坛元老   /  发表于:2011-6-16 17:26:00
地板
不应该在CellValidated事件中处理。


1. 应该先处理MultiRow的CellEndEdit事件, 在这个事件中判断,如果是从第二列结束的编辑状态,那么就将焦点跳转到第三列。
2. 还需要处理MultiRow的RowValidating事件, 在这个事件中判断,如果第三列的值是空,就Cancel掉,并且将焦点跳转到第三列。

代码如下:




  1.         void g_CellEndEdit(object sender, CellEndEditEventArgs e)
  2.         {
  3.             GcMultiRow g = sender as GcMultiRow;
  4.             if (e.CellIndex == 1)//这里CellIndex是 1,是要判断你刚刚输入完了第二列cell。
  5.             {
  6.                 g.CurrentCellPosition = new CellPosition(e.RowIndex, 2);//这里CellIndex是 2,是定位到第三列
  7.             }
  8.         }

  9. void g_RowValidating(object sender, CellCancelEventArgs e)
  10.         {
  11.             GcMultiRow g = sender as GcMultiRow;
  12.             if (g!= null )
  13.             {
  14.                 if (g.GetValue(e.RowIndex, 1)!= null && g.GetValue(e.RowIndex, 2) == null)//这里CellIndex是 2,是判断第三列
  15.                 {
  16.                     e.Cancel = true;
  17.                     g.CurrentCellPosition = new CellPosition(e.RowIndex, 2);//这里CellIndex是 2,是定位到第三列
  18.                 }
  19.             }
  20.         }

复制代码
VB代码:



  1. Private Sub g_CellEndEdit(sender As Object, e As CellEndEditEventArgs)
  2.         Dim g As GcMultiRow = TryCast(sender, GcMultiRow)
  3.         If e.CellIndex = 1 Then
  4.                 '这里CellIndex是 1,是要判断你刚刚输入完了第二列cell。
  5.                         '这里CellIndex是 2,是定位到第三列
  6.                 g.CurrentCellPosition = New CellPosition(e.RowIndex, 2)
  7.         End If
  8. End Sub
  9. Private Sub g_RowValidating(sender As Object, e As CellCancelEventArgs)
  10.         Dim g As GcMultiRow = TryCast(sender, GcMultiRow)
  11.         If g IsNot Nothing Then
  12.                 If g.GetValue(e.RowIndex, 1) IsNot Nothing AndAlso g.GetValue(e.RowIndex, 2) Is Nothing Then
  13.                         '这里CellIndex是 2,是判断第三列
  14.                         e.Cancel = True
  15.                                 '这里CellIndex是 2,是定位到第三列
  16.                         g.CurrentCellPosition = New CellPosition(e.RowIndex, 2)
  17.                 End If
  18.         End If
  19. End Sub
复制代码
回复 使用道具 举报
BELL_DL
新手上路   /  发表于:2011-6-17 09:29:00
5#
非常感谢及时得回复,目前出现的问题是第三列已经显示有值存在显示了,但是g.GetValue(e.RowIndex, 2)却显示是Nothing  还请帮忙看一下。                    
赋值语句如下:
Call CombList(mlrView.Rows(i).Item("colnumM30_KUBN1"), dtRecord.Rows(i).Item("M30_KUBN1"))
ComboBox捆绑方法如下:
Private Sub CombList(ByVal colComb As GrapeCity.Win.MultiRow.ComboBoxCell, ByVal strValue As String)
colComb.DataSource = dtRecord
        colComb.ValueMember = "CODE"
colComb.DisplayMember = "NAME"
        colComb.Value = strValue
ENDEUB
请帮忙看一下,谢谢!
回复 使用道具 举报
BELL_DL
新手上路   /  发表于:2011-6-17 09:44:00
6#
问题找到了,是我的有一个属性弄错了,不好意思!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部