1

再会!

对不起,如果我不能把它变成代码,但这是我的问题:

我编码 C#,使用 TextBox 控件,Multiline = true。

现在,我的问题是我需要知道用户的输入(每行)是否已经达到每行定义的最大长度。如果是,则不应将其打印在文本框中(就像 MaxLength 一样)。

输入示例(注:每行最大长度为 5):

Dog //3 characters
Cat //3 characters
Telephone //9 characters

电话不应该被打印,因为它超过了每行的最大长度,即 5。它应该只是“Telep”。


编辑:

实际上,我找到了解决这个问题的方法。就这么简单!!!!

if (txtText.Lines[txtText.GetLineFromCharIndex(txtText.SelectionStart)].Length > Convert.ToInt32(txtMaxlen.Text) - 1 && e.KeyChar!=8)
        {
            e.Handled = true;
        }

只需将该代码放入“OnKeyPress”事件中,然后中提琴!

4

4 回答 4

2

您可以处理OnTextChanged事件,然后使用Lines属性获取行数组。然后只需检查任何行的字符数超过您允许的字符数,如果是 - 更正并Lines再次设置为 a。当您进行此类更正时,您还必须防止事件上升,使用标志或取消订阅/订阅技术。

于 2013-06-13T07:18:38.180 回答
0

您可以从文本框的行中提取它们,例如:

var myarr = myTextBox.Lines.Select(n => n.Remove(3)).ToArray();

顺便说一句,使用 DataGridView 控件可能会更好。

于 2013-06-13T04:38:00.437 回答
0
textBox.OnTextChanged += (EventArgs e) => // invoked on every text change
{
    var lines = myTextBox.Where(x.Length > 5); // Get the long lines
    for (var i; i < lines.Count(); i++)  // iterate over long lines
    {
        lines[i] = lines[i].Substring(0, 5); // replace the line with its substring(stripped) value
    }
}
于 2013-06-13T07:27:30.653 回答
0

怎么样,这应该像MaxLength属性一样,并在新字符发生之前而不是之后处理它的添加。当一个键被按下时,它会检查光标当前所在行的长度。

public class MaxPerLineTextBox : TextBox
{
    public MaxPerLineTextBox()
    {
        base.Multiline = true;
    }

    public override bool Multiline
    {
        get
        {
            return true;
        }

        set
        {
            throw new InvalidOperationException("Readonly subclass");
        }
    }

    public int? MaxPerLine { get; set; }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (char.IsControl(e.KeyChar))
        {
            base.OnKeyPress(e);
            return;
        }

        int maxPerLine;
        if (this.MaxPerLine.HasValue)
        {
            maxPerLine = this.MaxPerLine.Value;
        }
        else
        {
            base.OnKeyPress(e);
            return;           
        }

        var count = 0;
        var lineLength = this.Lines.Select(line =>
            {
                count += line.Length;
                return new { line.Length, count };
            })
            .Last(c => c.count < this.SelectionStart).Length;

        if (lineLength < maxPerLine)
        {
            base.OnKeyPress(e);
            return;
        }

        e.Handled = true;
    }
}
于 2013-06-13T08:08:56.613 回答