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

我有一个用于inputURL的文本框。 我需要添加(http://)作为预定义的值到这个文本框,并希望它只能读取,所以用户将无法删除http://但他可以写在它之后。

在这里输入图像说明

任何帮助将不胜感激。

10 Solutions collect form web for “如何将WinForms文本框的前几个字符设置为只读?”

这里有几个选项:

  1. 简单的方法是在文本框外(左边)用这些字符创build一个标签 。 (为用户简单易懂)

  2. 创build第二个只读文本框,在开始时使用它,使其与input文本匹配,并将它们相邻排列。 是的,你会得到一个单一的像素线来分裂他们两个,但我认为这将增加用户体验,使其显而易见,这不是搞乱(我会亲自select这个选项)

  3. 如果你需要的风格,你可以滚动自己的用户控件 ,使用一个面板,标签和文本框与适当的边框样式集根据需要。 (最好的方式来获得你需要的确切样式)

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

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

你有没有考虑过把标签放在“http://”旁边呢? 然后当接受用户input时,你可以在你的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... } 

你甚至可能甚至不能显示http://并将其附加到Textbox.Text代码中。 首先检查一下,它不是以此为开始。

为了澄清我的最后一句话:

 string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text; 

像这样的东西?

 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); } } 

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

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

但不幸的是,如果将其Multiline属性设置为False,则效果不佳。

用TextBox做一个实用的方法就是把它设置回你想要的样子。 也适用于粘贴和select删除:

  string protect = "http://"; private void textBox1_TextChanged(object sender, EventArgs e) { if (!textBox1.Text.StartsWith(protect)) { textBox1.Text = protect; textBox1.SelectionStart = textBox1.Text.Length; } } 

如果你想要一个CSS方法(加上一个背景图像),你可以尝试这样的事情 :

 Enter URL: <input type="text" size="50" class="url" value="www.google.com" /> <style> input[type="text"].url { background: url(http://s18.postimage.org/4wkjdpidh/http.png) no-repeat left top transparent; text-indent: 34px; } </style> 

然后,当你去处理它时,只需要在input的值前加上http://

注意:由于我以某种方式从“HTML”标记来到这里,所以我误解了这个问题。 但是如果你想用HTML / CSS做这样的事情,这可能是一个解决scheme。

你可以做这样的事情:

 <style> label.mylabel, input.myinput { display: block; float: left; height: 20px; margin: 0; padding: 10px 5px 0px 5px; border: 1px solid #ccc; font-size: 11px; line-height: 11px; } label.mylabel { border-right: 0; } input.myinput { border-left: 0; } </style> <label class="mylabel" for="myinput">http://</label> <input id="myinput" class="myinput" name="myinput" value=""> 

所以这有两个好处:

  • 它看起来像一个input框
  • 当用户点击“http”时,实际的表单字段将被聚焦

当然,您必须在发送表单后手动添加“http://”。

整个事情有一个缺点。 什么是,如果你的用户想要插入“https://”? 🙂

干杯,菲利普

您可以将一个标签放在textboxt左边,并将其text属性设置为“http://”。 或者你可以附加2个文本框一个是只读的另一个不是只读的。 并写在只读的http://。

keyup事件创build一个委托(可能还有其他的,如剪贴板),并检查值的开始。

 $('#myField').bind('keypress', function(event) { if (event.charCode == 0 && event.currentTarget.value.length <= 7) { return false; } }); 
  • 如何为我的C#应用​​程序做一个安装程序?
  • 有没有什么办法来自动化Windows窗体testing?
  • C#listView,如何添加项目列2,3和4等?
  • 在Windows窗体中提示对话框
  • 如何让WebBrowser控件显示现代内容?
  • BackgroundWorker vs背景线程
  • 如何滚动RichTextBox到底部?
  • 表单不响应KeyDown事件
  • 检测WebBrowser完整的页面加载
  • 通过索引获取列表框项目的值
  • 实现INotifyPropertyChanged - 是否存在更好的方法?