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

任何帮助将受到高度赞赏.
mus*_*fan 63
以下是一些选项:
简单的方法是在文本框(左侧)外面创建一个带有这些字符的标签.(用户简单易懂)
创建第二个只读文本框以在开始时使用,设置它以匹配输入的文本框并将它们彼此相邻对齐.是的,你会得到一个像素线将它们分开,但我认为这会增加用户体验,使其显而易见,这不是为了搞乱(我个人会选择这个选项)
如果您需要该样式,则可以使用面板,标签和文本框滚动您自己的用户控件,并根据需要设置适当的边框样式.(获得所需风格的最佳方式)
第四种更烦人的方法是处理文本框本身的一个关键事件(如KeyDown).有了这个,你可以做很多检查,并改变插入位置,使其工作,但相信我,这将努力让它完美地工作!(太过努力才能做到正确)
总而言之,我认为选项2在这里是最好的.当然,如果你使用WPF,你无疑会在造型上有更多的灵活性.
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)
kri*_*gar 12
您甚至可能无法显示http://并将其附加到Textbox.Text代码.首先检查它是否也不是从那开始.
澄清我的上一句话:
string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text;
Run Code Online (Sandbox Code Playgroud)
像这样的东西?
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)
您可以使用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)