0

我正在尝试动态创建轨迹栏和标签。如果用户输入一个像 4 这样的数字,它会创建 4 个轨迹栏和 4 个标签。然后,如果用户移动任何动态创建的轨迹栏,则移动它并更新其关联的标签。然后将所有标签中的数字相加并将其存储在另一个标签调用总标签中。

这是另一种解释方式。用户输入数字 3。系统创建 3 个轨迹栏和 3 个标签(在轨迹栏旁边)。用户将第一个轨迹栏移动到 5,第一个标签自动更新为 5。用户将第二个轨迹栏移动到 3,第二个标签自动更新为 3。最后用户将第三个轨迹栏移动到位置 9,并且标签会自动更新为 9。
在右侧还有另一个标签显示 17 = (5+3+9)。

我发现了一些关于创建动态控件的网站,但我不知道如何将动态创建的跟踪栏链接到动态创建的标签。然后添加那些动态添加的标签。

所有这些都在 Windows 窗体上的 C# 中。

在创建标签和轨迹栏时,我做了一些与下面非常相似的事情。

for (int i = 0; i < 10; i++)
{
    Label label = new Label();
    label.Text = i.ToString();
    PlaceHolder1.Controls.Add(label);
}

提前感谢

- - - - - - - - - - - - 更新 - - - - - - - - -

void CreateLabeledTrackBars(控制主机,int n)

我该如何使用它,我希望当我开始一个新表格时

我所要做的就是这个..那样表单已经有n,但它似乎不起作用..我对控件的工作方式感到困惑。你能解释一下吗

namespace WindowsFormsApplication1
{
    public partial class Form3 : Form
    {

     public static Form2 myNewForm = new Form2();

           private TrackBar[] _trackBars;
           private Label[] _labels;
   public Form3(int n)
         {
CreateLabeledTrackBars(new Label (), n);
}

//Then the rest of the code 
4

1 回答 1

1

您需要处理您创建ValueChanged的每个事件。TrackBar要计算所有值的总和,请将创建的控件存储在数组中。

private TrackBar[] _trackBars;
private Label[] _labels;

void CreateLabeledTrackBars(Control host, int n)
{
    const int trackBarWidth = 150;
    const int minValue = 0;
    const int maxValue = 10;
    const int defaultValue = 0;

    _trackBars = new TrackBar[n];
    _labels = new Label[n];
    int y = 0;
    for(int i = 0; i < n; ++i)
    {
        var label = new Label()
        {
            Top     = y,
            Left    = trackBarWidth,
            Text    = defaultValue.ToString(),
            Parent  = host,
        };
        var trackBar = new TrackBar()
        {
            Top     = y,
            Width   = trackBarWidth,
            // save associated label
            Tag     = label,
            Minimum = minValue,
            Maximum = maxValue,
            Value   = defaultValue,
            Parent  = host,
        };
        // handle ValueChangedEvent
        trackBar.ValueChanged += OnTrackBarValueChanged;
        // apply vertical offset for next trackbar
        y += trackBar.Height;
        _trackBars[i] = trackBar;
        _labels[i] = label;
    }
}

void OnTrackBarValueChanged(object sender, EventArgs e)
{
    // get trackbar, which generated event
    var trackBar = (TrackBar)sender;
    // get associated label
    var associatedLabel = (Label)trackBar.Tag;
    associatedLabel.Text = trackBar.Value.ToString();
    // recalculate sum of all values and update other label here
}

现在,当您有一个轨迹栏数组时,获取所有值的总和应该是微不足道的。

于 2011-09-05T01:02:56.897 回答