Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将WinForms文本框的前几个字符设置为只读?_C#_.net_Winforms - Fatal编程技术网

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

C# 如何将WinForms文本框的前几个字符设置为只读?,c#,.net,winforms,C#,.net,Winforms,我有一个表单,上面有一个用于输入URL的文本框。我需要将(http://)作为预定义值添加到此文本框中,并希望它是只读的,这样用户将无法删除http://但可以在它之后写入 非常感谢您的帮助。您是否考虑过在其旁边放置一个标有“http://”字样的标签?然后,在接受用户输入时,您可以在textbox.Text中添加“http://” 还有一个想法: 每次按backspace键时,计算文本框中的字符数。如果为==7,则忽略退格。如果大于,则检查退格后的字符数。如果字符数小于7,请清除文本框并重置

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


非常感谢您的帮助。

您是否考虑过在其旁边放置一个标有“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);
        }
    }