c#在创建之前使用对象

时间:2013-06-19 18:29:30

标签: c# winforms events controls

我在活动中动态创建和跟踪栏, 现在我想要一个文本框来填充轨迹栏的值。

但我怎么可能这样做?因为我会收到错误,说动态创建的跟踪栏不存在。这是逻辑

这是我到目前为止所做的。

        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方法访问文本框或轨道栏。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

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