当文本长于文本框宽度时禁用文本滚动

Posted

技术标签:

【中文标题】当文本长于文本框宽度时禁用文本滚动【英文标题】:Disable Text Scrolling when text is longer than the TextBox Width 【发布时间】:2021-10-13 15:59:13 【问题描述】:

我在表单上有一个 customTextBox1。 customTextbox1 multiline is false,TextAlign设置为center.MaxLength为23,customTextBox1宽度为92.customTextBox1 Font设置为“MS ゴシック”,12F。 当我在文本框中输入“12345678901234567890123”时,文本滚动到最后一个字符。此外,当我单击文本时,文本以蓝色突出显示,我可以拖动到文本的左侧和右侧。

.NetFramework 3.5

我想要的是两件事:

1)当文本长于TextBox宽度时,我不想滚动到最后一个字符。我想在TextBox的右边距停止滚动。 例如, 当我输入“1234567890123456”时,我想显示“12345678901”,其余的溢出文本不应该显示。

2)当我点击并拖动文本时,我只想显示“12345678901” 并且想摆脱蓝色突出显示的选择。

1) 溢出文本正在显示

2)我可以单击并拖动到文本的末尾和文本的开头

这是我的代码

自定义文本框

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DisabledTextSelectForm

    public partial class CustomTextBox : TextBox
    
        public override bool AutoSize
        
            get  return base.AutoSize; 
            set  base.AutoSize = value; 
        

        public CustomTextBox()
        
            InitializeComponent();
        
    

表格1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DisabledTextSelectForm

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();

            customTextBox1.AutoSize = true;
            customTextBox1.Size = new Size(92,21);
            customTextBox1.Multiline = false;
            customTextBox1.TextAlign = HorizontalAlignment.Center;
            customTextBox1.MaxLength = 23;
            customTextBox1.Font = new Font("MS ゴシック", 12F);


        
    


更新1:

我想做 textBox 的这种奇怪行为,因为我正在制作一个用其他不再支持的语言编写的应用程序的精确副本。所以我们必须用 C# 来编写它。这两个应用程序都将在 Windows 上运行。 在旧的应用程序中,有一个文本框,用户可以在其中输入 ID 号。

1)该文本框不显示溢出文本。 如果我输入 ("12345678901234567890123") ,它只显示 "12345678901" 但如果我单击退格 [13] 次,文本以 "1234567890" 开头。所以我知道溢出文本只是没有显示。

2)我无法像在 C# textBox 中那样左右单击和拖动文本。

不过,我设法复制了 No.1 的行为。 这是我的代码

自定义文本框

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
using System.Runtime.InteropServices;

namespace DisabledTextSelectForm

    public partial class CustomTextBox : TextBox
    
        public override bool AutoSize
        
            get  return base.AutoSize; 
            set  base.AutoSize = value; 
        

        public bool DisabledScrolling  get; set; 

        int caretPos = 0;

        public CustomTextBox()
        
            InitializeComponent();
        

        protected override void OnKeyPress(KeyPressEventArgs e)
        
            var isDigit = char.IsDigit(e.KeyChar);
            var isBackSpace = e.KeyChar == (char)Keys.Back;

            var diffWidth = 0;

            if (Text.Length >= 2)
            
                var firstChar = TextRenderer.MeasureText(Text[0].ToString(), Font);
                var secondChar = TextRenderer.MeasureText(Text.Substring(0, 2).ToString(), Font);

                diffWidth = secondChar.Width - firstChar.Width;

                caretPos = Width / diffWidth;

            

            if (caretPos != 0 && Text.Length >= caretPos  && DisabledScrolling)
            
                
                if (isDigit)
                
                    Text = Text.Length < MaxLength ? Text + e.KeyChar.ToString() : Text;
                
                else if (isBackSpace)
                
                    Text = Text.Substring(0,Text.Length - 1);
                

                ScrollTo(caretPos - 1);
                e.Handled = true;

            


            base.OnKeyPress(e);
        

        private void ScrollTo(int scrollPosition)
        
            if (Text.Length >= scrollPosition)
            
                Select(scrollPosition, 0);
                ScrollToCaret();
            
        

    



表格1

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DisabledTextSelectForm

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();

            customTextBox1.DisabledScrolling = true;
            customTextBox1.AutoSize = true;
            customTextBox1.Size = new Size(92,21);
            customTextBox1.Multiline = false;
            customTextBox1.TextAlign = HorizontalAlignment.Center;
            customTextBox1.MaxLength = 23;
            customTextBox1.Font = new Font("MS ゴシック", 12F);


        
    


我知道如何禁用 TextBox 中文本的点击和拖动。

【问题讨论】:

这能回答你的问题吗? How to prevent TextBox auto scrolls when append text? @OlivierRogier谢谢你的回答。但我要求一个没有任何滚动条的单行文本框。 我不确定您是否可以通过使用 API 和窗口消息来实现这一点,但不要这样做!您将更改文本框的预期行为。用例是什么? @Steeeve 我知道这对 C# 文本框不好,但我必须这样做。我正在制作一个不再支持的用其他语言编写的应用程序的精确副本。所以我们必须用 C# 来编写它。这两个应用程序都将在 Windows 上运行。 因此您应该能够创建自己的custom text box control。 【参考方案1】:
    添加一个计时器,然后将其设置为启用,间隔为 10 毫秒,并在计时器的 Tick 事件中输入以下代码:
    private void timer1_Tick(object sender, EventArgs e)
    
        textBox1.SelectionLength = 0;
        textBox1.SelectionStart = 0;
        textBox1.ScrollToCaret();
    
    在 TextBox 的 MouseMove 事件中输入以下代码:
    private void textBox1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    
        textBox1.SelectionLength = 0;
        textBox1.SelectionStart = 0;
        textBox1.ScrollToCaret();
    
    在 TextBox 的 KeyDown 事件中输入以下代码:
    private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    
        textBox1.SelectionStart = textBox1.Text.Length;
    
    将此代码添加到初始化块中
    public Form1()
    
        InitializeComponent();

        textBox1.HideSelection = true;
    

【讨论】:

感谢您的回答。这看起来很有希望,但是当我左右拖动文本时它会闪烁。 欢迎您。对就这样。需要拖动吗?

以上是关于当文本长于文本框宽度时禁用文本滚动的主要内容,如果未能解决你的问题,请参考以下文章

html滚动文本框

jquery 基于单选按钮启用/禁用文本框

WPF 文本框和滚动行为

VB6在富文本框中按下向上/向下箭头时禁用系统哔声?

Firefox XUL 文本框:如何滚动到底部?

在 AngularJS 动态表单中禁用文本框