【问题标题】:How do I insert a newline in a multiline TextBox after mouse click in the TextBox?在文本框中单击鼠标后,如何在多行文本框中插入换行符?
【发布时间】:2016-06-06 08:58:42
【问题描述】:

当用户点击多行文本框时。我的表单应用程序应该在当前单击的行的末尾插入一个新行。

例如,这些是我的文本框中的行:

-Hallo
-Dear
-Kindly

如果用户点击第二行(-Dear),我的文本框中的值应该是:

-Hallo
-Dear

-Kindly

我的一个(失败的)尝试没有插入换行符:

int line = txtProjects.GetLineFromCharIndex(txtProjects.SelectionStart);
txtProjects.Lines[line] = txtProjects.Lines[line].Insert(txtProjects.Lines[line].Length, Environment.NewLine);

【问题讨论】:

    标签: c# string textbox multiline


    【解决方案1】:

    如果您想将某些内容附加到数组,则必须重新创建它,因为数组是固定大小的。你可以使用 LINQ:

    int lineCount = txtProjects.GetLineFromCharIndex(txtProjects.SelectionStart) + 1; // zero based
    string[] lines = txtProjects.Lines;
    txtProjects.Lines = lines 
        .Take(lineCount)
        .Concat(new[] {"\n"})
        .Concat(lines.Skip(lineCount))
        .ToArray();
    

    一种可能更易读的方法是使用List<string>.Insert

    List<string> lines = txtProjects.Lines.ToList();
    lines.Insert(lineCount, "");  //  null works also
    txtProjects.Lines = lines.ToArray();
    

    如果你想保持“光标”位置,你可以使用TextBox.Select:

    private void txtProjects_Clicked(object sender, EventArgs e)
    {
        int cursorPos = txtProjects.SelectionStart;
        int lineCount = txtProjects.GetLineFromCharIndex(cursorPos) + 1; // zero based
        List<string> lines = txtProjects.Lines.ToList();
        lines.Insert(lineCount, null);
        txtProjects.Lines = lines.ToArray();
        txtProjects.Select(cursorPos, 0);
    }
    

    【讨论】:

    • 它增加了 2 行?
    • @ISeeSharp:我已经用.Concat(new[] {"\n"}) 替换了.Concat(new[] {Environment.NewLine})。你注意到了吗? Environment.NewLine 将添加两行,因为 \r\n 都被视为行分隔符。
    • @ISeeSharp:我已经编辑了我的答案,以使用List&lt;T&gt; 展示一种更具可读性的方法。
    • 为什么光标会改变?它的位置返回到第一行的第一个位置。
    • @ISeeSharp:我已经编辑了我的答案以显示完整的示例。
    【解决方案2】:

    试试这个:

    var p = TextBox1.GetLineFromCharIndex[TextBox1.SelectionStart];
    List<string> str = new List<string>();
    str.AddRange(TextBox1.Lines);
    str.Insert(p + 1, "");
    TextBox1.Text = "";
    foreach (void st_loopVariable in str) {
        st = st_loopVariable;
        TextBox1.Text += st + Constants.vbNewLine;
    }
    

    它在 vb 上工作。我将其转换为 C#,因此可能会出现一些语法错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2011-08-20
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多