【问题标题】:Showing starting text of Mulitline TextBox when focus is changed更改焦点时显示多行文本框的起始文本
【发布时间】:2016-01-14 11:02:24
【问题描述】:

我正在创建一个具有 Multiline TextBox 的表单以输入 URL。预期的 URL 会很长。 用户将粘贴 URL 并移至下一个框。

现在,TextBox 会在用户移动到下一个 TextBox 时显示 URL 的结尾部分。我希望它显示 URL(域名)的开头而不是尾随部分。

当前:

预期:

这应该在用户离开TextBox时发生。

我在textBox_Leave() 事件中尝试了Selection 的各种方法,但我想,如果失去焦点,这些方法将不起作用。

我正在使用 .Net 框架 3.5。

更新:我使用的文本框是多行。如果 Mutliline 属性设置为 False,@S.Akbari 和 @Szer 建议的答案是完美的。我很晚才意识到Multiline 将扮演如此重要的角色。因此更新问题!

【问题讨论】:

    标签: c# .net winforms textbox


    【解决方案1】:

    Leave 事件中使用SelectionStart 应该可以工作:

    private void textBox1_Leave(object sender, EventArgs e)
    {
         textBox1.SelectionStart = 0;
    }
    

    之前:

    离开后TextBox

    【讨论】:

    • 已经尝试过...不起作用!如果我把它放在那里但没有动作,它也会到达断点
    • @Swanand...你确定你试过SelectionStart ??用我的代码再试一次。它现在对我有用,没有任何问题!
    • @user2946329 是的...完全相同的行...让我调试更多...(P.S.我没有投反对票)
    • @user2946329 我创建了一个不同的项目,只有两个文本框,它在那里工作:-( 我的实际项目有问题。
    • @user2946329 它可以工作,但是如果我将“Multiline”属性设置为“True”,这将停止工作。
    【解决方案2】:

    试过了,效果很好。 Proof

    public Form1()
    {
        InitializeComponent();
    
        textBox1.LostFocus += TextBox1_LostFocus;
    }
    
    private void TextBox1_LostFocus(object sender, EventArgs e)
    {
        textBox1.SelectionStart = 0;
        textBox1.SelectionLength = 0;
    }
    

    【讨论】:

    • LostFocus 不是一个好地方。比如Alt-Tab切换到另一个应用,然后Alt+Tab切换回来。
    • @IvanStoev 对。事件本身不是一个问题,而是一个好点。
    • @CodyGray 不是真的(否则为什么有 2 个单独的事件)。 LeaveContainerControl.ActiveControl 更改时被触发,这与物理上失去输入焦点不同。 “逻辑”与“物理”焦点:)
    • @Ivan 谢谢。说得通。实际上,我认为Leave 只是为了与 VB 6 兼容。我不知道它是在什么条件下提出的。离开 WinForms 世界太久了,无法记住该模型的细微差别。 :-)
    • @Szer 它可以工作,但是如果我将“Multiline”属性设置为“True”,这将停止工作
    【解决方案3】:

    我可以看到 Multiline 属性设置为 true 时它是如何不起作用的。

    一个简单的 API 调用就可以完成这项工作:

    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
    
    private const int WM_VSCROLL = 0x115;
    private const int SB_TOP = 6;
    
    void textBox1_Leave(object sender, EventArgs e) {
      SendMessage(textBox1.Handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero);
    }
    

    【讨论】:

    • @Swanand 用更清洁的解决方案更新了帖子。
    • 谢谢...但你应该保留两个答案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多