找回密码
 立即注册

QQ登录

只需一步,快速开始

beitesting

中级会员

28

主题

92

帖子

794

积分

中级会员

积分
794

活字格认证

beitesting
中级会员   /  发表于:2016-5-18 17:32  /   查看:3663  /  回复:3
本帖最后由 beitesting 于 2016-5-18 17:38 编辑

求助:单击Spread一行,如何让焦点跳转到一个TextBox上?

Spread是只读、按行选择。
画面上还有一个TextBox,
当点击一行时,
把这行上第二个单元格的值赋给这个TextBox,
然后把焦点跳转到这个TextBox上。

现在是利用CellClick实现了赋值,但是焦点始终在Spread上。
请大虾指点一下。

具体代码如下:
Imports FarPoint.Win.Spread

Public Class Form1
    Private Sub txtName_TextChanged(sender As Object, e As EventArgs) Handles txtName.TextChanged
        txtCode.Focus()
    End Sub

    Private Sub spdAtsukai_CellClick(sender As Object, e As CellClickEventArgs) Handles spdAtsukai.CellClick
        txtCode.Text = spdAtsukai.ActiveSheet.Cells(e.Row, 0).Text
        txtName.Text = spdAtsukai.ActiveSheet.Cells(e.Row, 1).Text ’执行这句后,Me.ActiveControl已经变成了txtName,但是CellClick执行完又变成焦点在Spread上了。
        
    End Sub

‘用下面的方法实现了按键盘上的上下按键把选中行的值,赋给TextBox,也能实现焦点迁移。
    Private Sub spdAtsukai_PreviewKeyDown(sender As Object, e As PreviewKeyDownEventArgs) Handles spdAtsukai.PreviewKeyDown
        If e.KeyCode = 38 Then
            Call spdAtsukai_CellClick(spdAtsukai, New CellClickEventArgs(Nothing, spdAtsukai.ActiveSheet.ActiveRowIndex - 1, spdAtsukai.ActiveSheet.ActiveColumnIndex, 0, 0, MouseButtons.None, False, False))
        ElseIf e.KeyCode = 40 Then
            Call spdAtsukai_CellClick(spdAtsukai, New CellClickEventArgs(Nothing, spdAtsukai.ActiveSheet.ActiveRowIndex + 1, spdAtsukai.ActiveSheet.ActiveColumnIndex, 0, 0, MouseButtons.None, False, False))
        End If
    End Sub
End Class

3 个回复

倒序浏览
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-5-18 18:28:05
沙发
您使用 SelectionChanged 事件试下 。我的代码是c#的,SelectionChanged 后给textbox赋值然后获取焦点
            fpSpread1.SelectionChanged += FpSpread1_SelectionChanged;
        

        private void FpSpread1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            textBox1.Text = fpSpread1.ActiveSheet.ActiveCell.Value.ToString();
            textBox1.Focus();
        }
回复 使用道具 举报
beitesting
中级会员   /  发表于:2016-5-18 19:00:24
板凳
dexteryao 发表于 2016-5-18 18:28
您使用 SelectionChanged 事件试下 。我的代码是c#的,SelectionChanged 后给textbox赋值然后获取焦点
    ...

谢谢您的解答。

SelectionChanged的实现方法与CellClick略有不同,
我要实现的是:哪怕多次点击同一个Cell,也依然可以赋值。

SelectionChanged好像实现不了这个功能。
回复 使用道具 举报
dexteryao讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2016-5-19 09:02:56
地板
您好
貌似cell click后 还需要做一些后续处理所以spread又重新获取到了焦点。没有其他事件可以直接支持您的需求,我想到了两种发放,一种是设置一个标记值,如果是cell click 后重新获取焦点则自动丢失焦点。
  1.             fpSpread1.CellClick += FpSpread1_CellClick;
  2.             fpSpread1.GotFocus += FpSpread1_GotFocus;
  3.             textBox1.GotFocus += TextBox1_GotFocus;
  4.         }

  5.         bool needLostFocus = false;

  6.         private void TextBox1_GotFocus(object sender, EventArgs e)
  7.         {
  8.             Console.WriteLine("bb");
  9.         }

  10.         private void FpSpread1_GotFocus(object sender, EventArgs e)
  11.         {
  12.             Console.WriteLine("aa");
  13.             if (needLostFocus)
  14.             {
  15.                 needLostFocus = false;
  16.                 textBox1.Focus();
  17.             }
  18.         }

  19.         private void FpSpread1_CellClick(object sender, CellClickEventArgs e)
  20.         {
  21.             needLostFocus = true;
  22.             textBox1.Text = fpSpread1.ActiveSheet.Cells[e.Row, e.Column].Value.ToString();
  23.             textBox1.Focus();
  24.         }
复制代码


第二种方法就是异步延时个半秒再让textbox获取焦点。但是这样做需要控制好连续操作。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部