C# - Select 文本框行取决于点击的位置

C# - Select Lines of TextBox depending on position of click

我正在开发一个 C# Windows 表单应用程序,其中我有一个不可编辑的 TextBox 显示自定义 class Note 的多个对象的详细信息.

Note 有一个重写的 ToString() 方法输出所有带有标签的属性在单独的行上,因此注释对象返回的字符串看起来像这样:

”记录于:12:00

记录者:史蒂夫

备注内容:hello world

我希望这些属性中的每一个都出现在 TextBox 中的单独一行,并且在一个音符数据的末尾和下一个音符数据的开始之间会有一个额外的空行。

一切正常,我现在想要实现的是使用光标从文本框中'select'注释的能力。

理想情况下,如果单击包含注释数据的 3 行中的任何一行,与该注释相关的所有三行都会突出显示。

有谁知道使用 TextBox 是否可行?如果是这样,我会去做吗?

谢谢,

马克

我写了一个自定义的 FlowLayoutPanel,它可以满足您的需求。

每次单击 "note" 时都会引发 NoteClick 事件,在事件处理程序中我只是 select 来自文本框的文本。

您可以根据需要更改文本框的格式。我让它们看起来像一个标签。

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();    

            noteFlow1.NoteClick += new NoteFlow.ClickHandler(noteFlow1_NoteClick);

            noteFlow1.Add("Hello" + Environment.NewLine + "Hello2" + Environment.NewLine + Environment.NewLine);
            noteFlow1.Add("Hello" + Environment.NewLine + "Hello2" + Environment.NewLine + Environment.NewLine);
            noteFlow1.Add("Hello" + Environment.NewLine + "Hello2" + Environment.NewLine + Environment.NewLine);
            noteFlow1.Add("Hello" + Environment.NewLine + "Hello2" + Environment.NewLine + Environment.NewLine);
            noteFlow1.Add("Hello" + Environment.NewLine + "Hello2" + Environment.NewLine + Environment.NewLine);
        }

        void noteFlow1_NoteClick(object sender, EventArgs e)
        {
            TextBox sndr = sender as TextBox;
            sndr.SelectAll();
        }
    }


    public class NoteFlow : FlowLayoutPanel
    {
        public delegate void ClickHandler(object sender, EventArgs e);
        public event ClickHandler NoteClick;

        public NoteFlow()
        {
            base.AutoScroll = true;
            base.FlowDirection = FlowDirection.TopDown;
        }

        public void Add(string noteText)
        {
            TextBox TextBox1 = new TextBox();
            TextBox1.Multiline = true;
            TextBox1.Text = noteText;
            TextBox1.ReadOnly = true;
            TextBox1.BorderStyle = 0;
            TextBox1.BackColor = this.BackColor;
            TextBox1.TabStop = false;
            Size size = TextRenderer.MeasureText(TextBox1.Text, TextBox1.Font);
            TextBox1.Width = size.Width;
            TextBox1.Height = size.Height;
            TextBox1.Click += new EventHandler(TextBox1_Click);
            base.Controls.Add(TextBox1);
        }

        void TextBox1_Click(object sender, EventArgs e)
        {
            if (NoteClick != null)
            {
                NoteClick(sender, e);
            }
        }
    }
}