如何将WinForms文本框的前几个字符设置为只读?
我有一个用于inputURL的文本框。 我需要添加(http://)作为预定义的值到这个文本框,并希望它只能读取,所以用户将无法删除http://但他可以写在它之后。
任何帮助将不胜感激。
这里有几个选项:
-
简单的方法是在文本框外(左边)用这些字符创build一个标签 。 (为用户简单易懂)
-
创build第二个只读文本框,在开始时使用它,使其与input文本匹配,并将它们相邻排列。 是的,你会得到一个单一的像素线来分裂他们两个,但我认为这将增加用户体验,使其显而易见,这不是搞乱(我会亲自select这个选项)
-
如果你需要的风格,你可以滚动自己的用户控件 ,使用一个面板,标签和文本框与适当的边框样式集根据需要。 (最好的方式来获得你需要的确切样式)
-
第四,更令人讨厌的方式,将是处理文本框本身的一个关键事件(如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; } });