找回密码
 立即注册

QQ登录

只需一步,快速开始

chenf1980

论坛元老

41

主题

147

帖子

9349

积分

论坛元老

积分
9349

活字格认证

chenf1980
论坛元老   /  发表于:2011-6-19 10:50  /   查看:7069  /  回复:5
行追加方法如下:
Public Function AddNewRowInRange() As DataRow
        If DataSource IsNot Nothing AndAlso TypeOf (DataSource) Is DataTable Then
            Dim dt As DataTable = DirectCast(DataSource, DataTable)
            Dim dr As DataRow = dt.NewRow
            Dim currentRowIndex As Integer = Me.RowCount
            dt.Rows.InsertAt(dr, currentRowIndex)
            ' ClearSelected()
            Me.Focus()
            Return dr
        End If
        Return Nothing
    End Function

调用的地方如下:
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        TestMultirow1.AddCopyRow()
        TestMultirow1.SetFocus(TestMultirow1.RowCount - 1, 0)
        TestMultirow1.Item(TestMultirow1.RowCount - 1, 0).Style.ImeMode = Windows.Forms.ImeMode.Hiragana
    End Sub

发现尽管设置了Imemode = hiragana,但是发现imemode还是没有变,还是直接入力模式

5 个回复

倒序浏览
neil
论坛元老   /  发表于:2011-6-20 09:15:00
沙发

回复 1# chenf1980 的帖子

看不出来你写的这两个方法是什么关系。
不过,设置了ImeMode之后,需要把焦点切到别的Cell然后再次切回来,才能起作用。
你可以试试在之前(比如在模板上就把ImeMode设好)把ImeMode设好,然后再切焦点。
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-6-20 10:13:00
板凳
切到别的Cell ,然后再切回来,是可以用的,这个我早就试过了
现在的关键就在于,我已经在模版上设置好了,并且在代码里也写了,追加一行后,聚焦的时候就想要变成hiragana的模式。
回复 使用道具 举报
neil
论坛元老   /  发表于:2011-6-20 11:10:00
地板

回复 3# chenf1980 的帖子

首先,只需要在模板上设置就可以了,不需要在code中再次设置。

其次,根据你的情况,    应该是,当焦点在新行上的Cell上的时候,在Windows任务栏上手动把ImeMode改成了非hiragana的其他模式(比方入力模式),然后,再在Code中调用了你写的AddNewRowInRange方法。此时,currentCell会向下移,并且依然保持在新行上。   此时,Windows任务栏上的输入法依然是入力模式,  但此时你期望它是你在模板上设置的hiragana。

这是Design。原因是,调用AddNewRowInRange添加新行以后,CurrentCell会向下移,而这个移的过程是由于你添加的新行把currentCell所在的新行给“挤”下来了,但是对于程序来讲,CurrentCell的位置看起来发生了变化,实际上CurrentCell(的实例)并没有发生变化(只是被挤下来了而已)。所以没有重新同步输入法状态。依然是你上次手动改的入力模式。

为了解决这个问题,你可以在AddNewRowInRange方法中,添加新行以后, 先把CurrentCellPosition设置到(0,0),然后在设回来,输入法状态就会重新同步了。
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-6-20 11:52:00
5#
Public Function AddNewRowInRange() As DataRow
        If DataSource IsNot Nothing AndAlso TypeOf (DataSource) Is DataTable Then
            Dim dt As DataTable = DirectCast(DataSource, DataTable)
            Dim dr As DataRow = dt.NewRow
            Dim currentRowIndex As Integer = Me.RowCount
            dt.Rows.InsertAt(dr, currentRowIndex)
            Me.CurrentCellPosition = New CellPosition(0, 0)
            Me.Focus()
            Return dr
        End If
        Return Nothing
    End Function

这样做了,发现还是不行啊
回复 使用道具 举报
neil
论坛元老   /  发表于:2011-6-20 12:07:00
6#
Public Function AddNewRowInRange() As DataRow
        If DataSource IsNot Nothing AndAlso TypeOf (DataSource) Is DataTable Then
            Dim dt As DataTable = DirectCast(DataSource, DataTable)
            Dim dr As DataRow = dt.NewRow
            Dim currentRowIndex As Integer = Me.RowCount
            dt.Rows.InsertAt(dr, currentRowIndex)
      ‘Me.CurrentCellPosition = New CellPosition(0, 0) ’删掉这一句
            Me.Focus()

Dim old = Me.CurrentCellPosition
Me.CurrentCellPosition = New CellPosition(0, 0)
Me.CurrentCellPosition = old

            Return dr
        End If
        Return Nothing
    End Function
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部