C# 如何将WinForms文本框的前几个字符设置为只读?
我有一个表单,上面有一个用于输入URL的文本框。我需要将(http://)作为预定义值添加到此文本框中,并希望它是只读的,这样用户将无法删除http://但可以在它之后写入C# 如何将WinForms文本框的前几个字符设置为只读?,c#,.net,winforms,C#,.net,Winforms,我有一个表单,上面有一个用于输入URL的文本框。我需要将(http://)作为预定义值添加到此文本框中,并希望它是只读的,这样用户将无法删除http://但可以在它之后写入 非常感谢您的帮助。您是否考虑过在其旁边放置一个标有“http://”字样的标签?然后,在接受用户输入时,您可以在textbox.Text中添加“http://” 还有一个想法: 每次按backspace键时,计算文本框中的字符数。如果为==7,则忽略退格。如果大于,则检查退格后的字符数。如果字符数小于7,请清除文本框并重置
非常感谢您的帮助。您是否考虑过在其旁边放置一个标有“http://”字样的标签?然后,在接受用户输入时,您可以在textbox.Text中添加“http://” 还有一个想法: 每次按backspace键时,计算文本框中的字符数。如果为==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...
}
以下是一些选项:
总而言之,我认为选项2在这里是最好的。当然,如果您使用的是WPF,那么毫无疑问,您在样式设置方面会有更多的灵活性。您可以将标签放在textboxt的左边,并将其文本属性设置为“http://”。或者您可以附加两个文本框,一个是只读的,另一个不是只读的。然后将http://写在只读的文件中。您甚至不能显示http://并将其附加到文本框中。文本代码。首先检查它是否也以这个开头 为了澄清我的最后一句话:
string sURL = txtURL.Text.StartsWith("http://") ? txtURL.Text : "http://" + txtURL.Text;
为
keyup
事件(可能还有其他事件,例如剪贴板)创建一个委托,并检查值的开头。$('#myField')。绑定('keypress',函数(事件)
$('#myField').bind('keypress', function(event)
{
if (event.charCode == 0 && event.currentTarget.value.length <= 7)
{
return false;
}
});
{
如果(event.charCode==0&&event.currentTarget.value.length类似的内容
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);
}
}
注意:我误读了这个问题,因为不知何故我是从“HTML”-标签来到这里的。但是如果你想用HTML/CSS做类似的事情,这可能是一个解决方案。
你可以这样做:
<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="">
label.mylabel,input.myinput{
显示:块;
浮动:左;
高度:20px;
保证金:0;
填充:10px 5px 0px 5px;
边框:1px实心#ccc;
字体大小:11px;
线高:11px;
}
label.mylabel{
右边界:0;
}
input.myinput{
左边框:0;
}
http://
因此,这有两个优点:
- 它看起来像一个输入框
- 当用户点击“http”时,实际表单字段将被聚焦
当然,您必须在表单中发送后手动添加“http://”
这一切都有一个缺点:如果你的用户想插入
“https:/”?:)
干杯,
Philipp如果您想要CSS方法(结合背景图像),您可以尝试:
输入URL:
输入[type=“text”].url{
背景:url(http://s18.postimage.org/4wkjdpidh/http.png)无重复左上透明;
文本缩进:34px;
}
然后,在处理输入值时,只需将http://
预先添加回输入值即可。您可以使用RichTextBox,它允许保护文本:
public Form1() {
InitializeComponent();
richTextBox1.Text = "http://";
richTextBox1.SelectAll();
richTextBox1.SelectionProtected = true;
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.DetectUrls = false; // optional
}
但不幸的是,如果您将其Multiline属性设置为False,它将无法正常工作
使用文本框的一种实用方法是将其设置回您想要的方式。也可用于粘贴和选择删除:
string protect = "http://";
private void textBox1_TextChanged(object sender, EventArgs e) {
if (!textBox1.Text.StartsWith(protect)) {
textBox1.Text = protect;
textBox1.SelectionStart = textBox1.Text.Length;
}
}
作为一个选项,您可以向TextBox
控件添加自动大小标签。此外,要强制文本在标签后开始,您需要发送EM\u SETMARGINS
以对文本框应用左填充:
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class SampleTextBox : TextBox
{
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
private const int EM_SETMARGINS = 0xd3;
private const int EC_LEFTMARGIN = 1;
private Label label;
public SampleTextBox() : base()
{
label = new Label() { Text = "http://", Dock = DockStyle.Left, AutoSize = true };
this.Controls.Add(label);
}
public string Label
{
get { return label.Text; }
set { label.Text = value; if (IsHandleCreated) SetMargin(); }
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
SetMargin();
}
private void SetMargin()
{
SendMessage(this.Handle, EM_SETMARGINS, EC_LEFTMARGIN, label.Width);
}
}
最简单的解决方案是简单地将“http://”在文本框前的标签中。绑定一个按键事件;测试文本字段的长度;如果@Ismael,这将不起作用。他们可以键入一堆文本,然后在不触发代码的情况下更改http://部分,因为它将超过7个字符。@Ismael不会阻止您更改http://
,只要它超过7个字符。您完全同意吗确保输入的URL不能以其他方案开始?例如“https://”我假设他想要在文本框中显示它,因此他不想要标签的想法。我同意一点,但在OP没有进一步澄清他试图实现什么以及为什么的情况下,我们能做的最好是抛出一些建议。我的观点是在从文本框中检索的内容的值中保留http://的值.Text值。如果在框中维护http://只是为了美观,那么需要付出更多的努力。如何阻止它们,然后键入http://
,并在http://http://blahblah
。显然,在添加之前需要检查解决方案。+1虽然我不认为这是其他人建议的,但是有效的想法。他确实有只读部分的想法。;)如果。如果字符串长于7,他们仍然可以更改开头。@SteveDog:事实上,它不起作用
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
public class SampleTextBox : TextBox
{
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hwnd, int msg, int wParam, int lParam);
private const int EM_SETMARGINS = 0xd3;
private const int EC_LEFTMARGIN = 1;
private Label label;
public SampleTextBox() : base()
{
label = new Label() { Text = "http://", Dock = DockStyle.Left, AutoSize = true };
this.Controls.Add(label);
}
public string Label
{
get { return label.Text; }
set { label.Text = value; if (IsHandleCreated) SetMargin(); }
}
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
SetMargin();
}
private void SetMargin()
{
SendMessage(this.Handle, EM_SETMARGINS, EC_LEFTMARGIN, label.Width);
}
}