如何将WinForms TextBox的前几个字符设置为只读?

Raf*_*ari 50 .net c# winforms

我有一个带有文本框的表单,用于输入URL.我需要将(http://)作为预定义的值添加到此文本框中,并希望它只读,这样用户就无法删除http://但是他可以在它之后写.

在此输入图像描述

任何帮助将受到高度赞赏.

mus*_*fan 63

以下是一些选项:

  1. 简单的方法是在文本框(左侧)外面创建一个带有这些字符的标签.(用户简单易懂)

  2. 创建第二个只读文本框以在开始时使用,设置它以匹配输入的文本框并将它们彼此相邻对齐.是的,你会得到一个像素线将它们分开,但我认为这会增加用户体验,使其显而易见,这不是为了搞乱(我个人会选择这个选项)

  3. 如果您需要该样式,则可以使用面板,标签和文本框滚动您自己的用户控件,并根据需要设置适当的边框样式.(获得所需风格的最佳方式)

  4. 第四种更烦人的方法是处理文本框本身的一个关键事件(如KeyDown).有了这个,你可以做很多检查,并改变插入位置,使其工作,但相信我,这将努力让它完美地工作!(太过努力才能做到正确)

总而言之,我认为选项2在这里是最好的.当然,如果你使用WPF,你无疑会在造型上有更多的灵活性.

  • 选项5:如果缺少,则隐含地添加`http://`,就像浏览器一样.因此,当我输入`stackoverflow.com`并且文本框失去焦点时,将其更改为`http:// stackoverflow.com`.如果它已经以`http://`开头,那就把它留在那里,甚至不仅仅接受`http`作为协议. (49认同)
  • 不要忘记给'https://'一些爱......虽然今天很少见,但ftp:`仍然有它的位置. (10认同)

Eri*_*ric 20

您是否考虑在其旁边放置一个带有"http://"作为文本的标签?然后在接受用户输入时,您可以使用textbox.Text附加"http://".

这是另一个想法:

在每个退格按下时,计算文本框中的字符数.如果是== 7,则忽略退格.如果它更大,则检查退格后的字符数.如果字符数小于7,请清除文本框并重置文本.

private void a_keyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)8)
    {
        if (myTextbox.Text.Length == 7)
        // do stuff..
    }
    else if //do stuff...
}
Run Code Online (Sandbox Code Playgroud)

  • 你必须检查每一种可能性.如果我只删除'h'它不会以"http:\\"开头,但是如果你添加它而不删除"ttp:\\",你将得到"http:\\ ttp:\\\***. (4认同)
  • 退格选项是一些不错的选择,但不要忘记粘贴并选择所有问题. (3认同)

kri*_*gar 12

您甚至可能无法显示http://并将其附加到Textbox.Text代码.首先检查它是否也不是从那开始.

澄清我的上一句话:

string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text;
Run Code Online (Sandbox Code Playgroud)


Iva*_*čić 6

像这样的东西?

private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
    var textBox = sender as TextBox;

    if (!textBox.Text.StartsWith("http://"))
    {
        textBox.Text = "http://";
        textBox.Select(textBox.Text.Length, 0);

    }
}
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 5

您可以使用RichTextBox,它允许保护文本:

    public Form1() {
        InitializeComponent();
        richTextBox1.Text = "http://";
        richTextBox1.SelectAll();
        richTextBox1.SelectionProtected = true;
        richTextBox1.SelectionStart = richTextBox1.Text.Length;
        richTextBox1.DetectUrls = false;  // optional
    }
Run Code Online (Sandbox Code Playgroud)

但不幸的是,如果将Multiline属性设置为False,它将无法正常工作.

使用TextBox执行此操作的实用方法是将其设置为您想要的方式.也适用于粘贴和选择删除:

    string protect = "http://";

    private void textBox1_TextChanged(object sender, EventArgs e) {
        if (!textBox1.Text.StartsWith(protect)) {
            textBox1.Text = protect;
            textBox1.SelectionStart = textBox1.Text.Length;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • RTB的好主意,但这样的样式将与其他文本框样式冲突:( (2认同)