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

时间:2012-06-14 14:42:33

标签: c# .net winforms

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

enter image description here

任何帮助都将受到高度赞赏。

11 个答案:

答案 0 :(得分:63)

以下是一些选项:

  1. 简单的方法是在文本框(左侧)外面用这些字符创建label。 (用户简单易懂)

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

  3. 如果您需要可以使用面板,标签和文本框的样式roll your own user control,并根据需要设置适当的边框样式。 (获得所需风格的最佳方式)

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

  5. 总结一下,我认为选项2 是最好的。当然,如果你使用WPF,你无疑会在样式上有更多的灵活性。

答案 1 :(得分:20)

您是否考虑在" http://"旁边贴上标签?作为文字?然后在接受用户输入时,您只需附加" http://"使用textbox.Text。

这是另一个想法:

在每个退格按下时,计算文本框中的字符数。如果是== 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 :(得分:12)

您甚至无法显示http://,只需将其附加到Textbox.Text代码即可。首先检查它是否也没有。

澄清我的上一句话:

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

答案 3 :(得分: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);

    }
}

答案 4 :(得分:5)

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

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

但不幸的是,如果将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;
        }
    }

答案 5 :(得分:4)

注意:我误解了这个问题,因为不知怎的,我是从“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="">

所以这有两个好处:

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

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

整个事情有一个缺点。什么是,如果您的用户想要插入 的 'https://'? :)

干杯, 菲利普

答案 6 :(得分:4)

如果您想要一种CSS方法(加上背景图片),可以试试something like this

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>

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

答案 7 :(得分:4)

作为一个选项,您可以向TextBox控件添加自动尺寸标签。另外,要强制文本在标签后开始,还需要发送EM_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);
    }
}

答案 8 :(得分:1)

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

答案 9 :(得分:0)

keyup事件创建委托(可能还有其他人,例如剪贴板)并检查值的开头。

答案 10 :(得分:0)

$('#myField').bind('keypress', function(event)
{
    if (event.charCode == 0 && event.currentTarget.value.length <= 7)
{
     return false;
}
});