【问题标题】:Assigning Events to newly created controls将事件分配给新创建的控件
【发布时间】:2013-10-01 05:46:07
【问题描述】:

您好,我有这个为表单创建标签的循环:

  private Label newLabel = new Label();
    private int txtBoxStartPosition = 300;
    private int txtBoxStartPositionV = 25;

    private void button1_Click(object sender, EventArgs e)
    {
        int txt = Int32.Parse(textBox1.Text);
        for (int i = 0; i < txt; i++)
        {
            newLabel = new Label();
            newLabel.Location = new System.Drawing.Point(txtBoxStartPosition, txtBoxStartPositionV);
            newLabel.Size = new System.Drawing.Size(25, 25);
            newLabel.Text = i.ToString();
            newLabel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            newLabel.ForeColor = Color.Red;
            newLabel.Font = new Font(newLabel.Font.FontFamily.Name, 10);
            newLabel.Font = new Font(newLabel.Font, FontStyle.Bold);
            newLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight;  

            this.Controls.Add(newLabel);
            txtBoxStartPosition -= 35;


        }

我在 MouseMove 和 MouseDown 上有一些事件,使控件可以用鼠标抓取和放下。

        private Point MouseDownLocation;

    private void MyControl_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            MouseDownLocation = e.Location;
        }
    }

    private void MyControl_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            label1.Left = e.X + label1.Left - MouseDownLocation.X;
            label1.Top = e.Y + label1.Top - MouseDownLocation.Y;
        }
    }

我的问题是:有什么方法可以将这些事件分配给新创建的标签?

提前感谢您的宝贵时间。

【问题讨论】:

  • 你不能像newLabel.MouseMove += new MouseEventHandler(this.MyControl_MouseMove);一样添加它们吗?
  • 感谢您的评论,但我该如何处理命名问题?我的意思是我在 MouseMove / label1.Left .. 上有硬编码名称,请你帮帮我吗?
  • 哦。标签将是发件人。你可以说Label label = sender as Label 并使用该变量

标签: c# .net winforms


【解决方案1】:

您需要连接和取消连接您的事件。闲置的处理程序是内存泄漏的来源。

List<Label> myLabels = new List<Label>(txt);

for (int i = 0; i < txt; i++)
{
    newLabel = new Label();
    newLabel.MouseMove += MyControl_MouseMove;
    newLabel.MouseDown += MyControl_MouseDown;
    myLabels.Add(newLabel);
.......

// Later in Dispose
foreach (var lbl in myLabels)
{
     lbl -= MyControl_MouseMove;
     lbl -= MyControl_MouseDown;
}
myLabels.Clear();

【讨论】:

    【解决方案2】:

    试试这个:

    newLabel.MouseMove += MyControl_MouseMove;
    newLabel.MouseDown += MyControl_MouseDown;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 2012-05-22
      • 2014-09-08
      • 2019-09-08
      • 1970-01-01
      相关资源
      最近更新 更多