获取 NumericUpDown 的值会移动插入符位置,我可以阻止这个吗?

发布于 2024-09-25 21:00:32 字数 262 浏览 7 评论 0原文

我注意到,当我在 C# 应用程序中请求 NumericUpDown 控件的 Value 时,插入符号会重置为位置 0。这很烦人,因为我的应用程序会定期抓取控件的值,因此如果在用户键入内容时发生这种情况,插入符号会意外移动,从而扰乱他们的输入。

有没有办法防止这种情况,或者解决方法?它似乎没有 SelectionStart 属性,否则我可以让轮询过程保存插入符号位置,获取值,然后将其设置回来作为一个不错的解决方法。

I've noticed that when I request the Value of a NumericUpDown control in a C# app, the caret is reset to position 0. This is annoying because my app is periodically grabbing the value of the control, so if this happens while a user is typing into it the caret unexpectedly moves, messing with their input.

Is there a way to prevent this, or a workaround? It doesn't seem to have a SelectionStart property, otherwise I could have the polling process save the caret position, get the value, then set it back as a decent workaround.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你与昨日 2024-10-02 21:00:33

中间的按键会扰乱文本中的打字和光标,因为获取值会扰乱插入符位置。因此,我们采用了不确定的解决方案:获取 textboxbase 并自行设置插入符号的值。

    private void numericUpDown_KeyUp(object sender, KeyEventArgs e)
    {
        try
        {
            NumericUpDown numericUpDownsender = (sender as NumericUpDown);

            TextBoxBase txtBase = numericUpDownsender.Controls[1] as TextBoxBase;
            int currentCaretPosition = txtBase.SelectionStart;
            numericUpDownsender.DataBindings[0].WriteValue();
            txtBase.SelectionStart = currentCaretPosition;
        }
        catch (Exception ex)
        {

        }
    }

Intervening key up messes up the typing and the cursor in the text, as getting the value messes up the caret position. Hence the iffy solution of getting the textboxbase and setting the value of the caret ourselves.

    private void numericUpDown_KeyUp(object sender, KeyEventArgs e)
    {
        try
        {
            NumericUpDown numericUpDownsender = (sender as NumericUpDown);

            TextBoxBase txtBase = numericUpDownsender.Controls[1] as TextBoxBase;
            int currentCaretPosition = txtBase.SelectionStart;
            numericUpDownsender.DataBindings[0].WriteValue();
            txtBase.SelectionStart = currentCaretPosition;
        }
        catch (Exception ex)
        {

        }
    }
三生池水覆流年 2024-10-02 21:00:32

我可以用小数点重现错误。在计时器滴答事件中(或在提取值的任何位置),尝试添加以下代码:

numericUpDown1.DecimalPlaces = 2;

numericUpDown1.Select(numericUpDown1.Value.ToString().Length, 0);

您无法获取 SelectionStart,但如果您从当前字符串的末尾进行选择并设置 selection length< /code> 为 0,它应该将插入符号保持在正确的位置。

I can reproduce the error with the decimal point. In your timer tick event (or wherever you're pulling in the value), try adding this code:

numericUpDown1.DecimalPlaces = 2;

numericUpDown1.Select(numericUpDown1.Value.ToString().Length, 0);

You can't get the SelectionStart, but if you select from the end of the current string and set the selection length to 0, it should keep the caret in the correct place.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文