【问题标题】:c# use object before it's createdc# 在创建对象之前使用它
【发布时间】:2013-06-16 10:13:45
【问题描述】:

我在事件上动态创建和跟踪栏, 现在我想用轨迹栏的值填充一个文本框。

但我怎么可能做到这一点?因为我会收到一条错误消息,说动态创建的轨迹栏不存在。这是逻辑

这是我目前所拥有的。

        TrackBar trackBar = new TrackBar();
        trackBar.Name = "TrackbarWidth" + trackbarName++;
        trackBar.Tag = "dispose";
        trackBar.Maximum = 85;
        trackBar.Minimum = 65;
        trackBar.SmallChange = 5;
        trackBar.TickFrequency = 5;
        trackBar.Value = WidthValue;
        trackBar.Location = new Point(175, 440 + (50 * trackbarName));
        trackBar.Size = new System.Drawing.Size(100, 25);
        this.Controls.Add(trackBar);

        TextBox textBox = new TextBox();
        textBox.Name = "TrackbarWidth" + TextboxName++;
        textBox.Text = trackBar.Value.ToString();
        textBox.Tag = "dispose";
        textBox.Location = new Point(300, 440 + (50 * TextboxName));
        textBox.Size = new System.Drawing.Size(30, 25);
        this.Controls.Add(textBox);

        lineWidth += 4;
    }
#endregion
}

private void trackBar1_Scroll(object sender, EventArgs e){
    textBox1.Text = trackBar1.Value.ToString();
}

这个解决方案的问题是我无法访问trackBar1_Scroll方法中的文本框或轨迹栏。

【问题讨论】:

  • trackbar1在哪里初始化?
  • 错误出现在按钮 trackbar1_scroll 事件中。它说“trackbar1”和“textbox1”不存在,这是真的。因为它们是动态创建的。
  • trackbar1 在 listbox.selectedIndexChanged 上初始化。

标签: c# winforms events controls


【解决方案1】:

sender 参数始终是触发事件的控件:

private void trackBar_Scroll(object sender, System.EventArgs e)
{
    // TextBox also dynamic? One way is using ControlCollection.Find
    textBox1 = this.Controls.Find("textBox1", true).FirstOrDefault() as TextBox;
    if(textBox1 != null)
        textBox1.Text = trackBar1.Value.ToString();
}

但是,如果您动态创建它,您还必须创建事件处理程序:

TrackBar trackBar = new TrackBar();
trackBar.Scroll += this.trackBar_Scroll;

【讨论】:

  • 他仍然无法通过这种方式访问​​文本框,只能访问轨迹栏。
  • 现在,它当然也不知道 textbox1,因为它是动态创建的。但我似乎无法让它工作。添加此“ textBox.TextChanged += this.textBox_TextChanged;”到动态文本框创建器应该可以正常工作吗?
  • @Servy:哦,TextBox也是动态创建的?
  • @user1859829:如果您知道名称,可以使用Controls.Find。编辑了我的答案。
【解决方案2】:

这里使用的最简单的解决方案是使用能够关闭您需要的两个变量的匿名事件处理程序。在你完成文本框的构建之后包含这个:

this.Controls.Add(textBox);
trackBar.Scroll += (s, args) => {
    textbox.Text = trackbar.Value.ToString();
};

【讨论】:

  • 谢谢,它有效。虽然我不理解任何第二行代码:)
  • @user1859829 它创建一个新的匿名方法并将其添加为Scroll 事件的事件处理程序。如果您有兴趣进一步阅读该主题,它尤其被称为“Lambda”。
  • 谢谢,我更了解代码并能够自己重新创建它。而不仅仅是复制粘贴它。非常感谢!
猜你喜欢
  • 2013-06-15
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多