有没有办法在窗体上动态复制控件及其事件处理程序?

时间:2012-02-28 23:15:14

标签: c# winforms

所以这就是我想要完成的事情:我有一个名为txtNotes的富文本框和两个要保存或删除的按钮。单击保存时,富文本框中的文本将保存到数据库(不是问题),下面将显示一个新的富文本框和按钮,其作用与以前相同。删除按钮将从表单中删除这些控件,并从数据库中删除信息。用户应假设能够保存并创建极少数的笔记。

我不知道这是否可能,或者我是否以完全错误的方式思考这个问题。如果您有任何好的解决方案,我将不胜感激。

3 个答案:

答案 0 :(得分:2)

看起来它可能会失控,而且非常复杂。

如果您有一个允许用户输入文本的文本框和一个要保存的按钮,为什么不使用listView或类似的东西,这可以向用户显示已添加到数据库的内容然后允许他们选择项目并按照自己的意愿删除它们。

此控件将更易于管理,并且可以轻松滚动以获取“无限”条目数。

您需要获取listView中所选项目的列表,以便在deleteButton_Click事件中删除,然后使用此列表迭代删除数据库中的所有项目。

希望这有帮助。

答案 1 :(得分:1)

在UserControl中填充RTB和按钮似乎是一个很好的起点。

然后创建一个从保存按钮触发的TextSaveRequested(Object sender, TextEventArgs e)事件,并在按下删除时简单地Dispose()控件(以及相关的数据库活动,可能是TextDeleteRequested事件)。 / p>

答案 2 :(得分:0)

尝试这样的事情:

public Form1()
{
    InitializeComponent();
    Controls.Add(CreateBox(0, 0));
    AutoScroll = true;
}

Panel CreateBox(int X, int Y)
{
    Panel panel = new Panel();
    panel.Location = new Point(X, Y);
    panel.Size = new Size(100, 150);

    RichTextBox rtb = new RichTextBox();
    panel.Controls.Add(rtb);

    Button b = new Button();
    b.Location = new Point(10, 100);
    b.Tag = rtb;
    b.Click += AllButtons_Click;
    panel.Controls.Add(b);

    return panel;
}

int i = 0;
void AllButtons_Click(object sender, EventArgs e)
{
    ((RichTextBox)((sender as Button).Tag)).Text = "Clicked";
    i += 150;
    Controls.Add(CreateBox(0, i));
}

虽然我从AutoScroll获得了一些奇怪的行为。