Как я могу делать ProgressBar, но с блоками различных цветов?

Я разрабатываю приложение, которое берет файлы с информацией о доказательствах в ensambles и должна быть одна ProgressBar что увеличился всякий раз когда было сделано доказательство, если доказательство бьет козырем блок, который он увеличивает, должно быть красным, и если изюм должен быть зеленью.

Я пробовал с ProgressBar visualStudio, но я не подумал, как менять ему цвета в каждый блок, так что я пробовал симулировать одну с одним TableLayoutPanel, общее количество колонн - цель, которой нужно достигать доказательств, и всякий раз когда они делают доказательство идея состояла в том, чтобы помещать панель и менять ему фон цвета, но он ничего не перемещает.

Здесь я оставляю им код:

tlpBar.ColumnCount = Settings.Default.target;
tlpBar.Controls.AddRange(new Panel[Settings.Default.target]);
foreach(Control ctrl in tlpBar.Controls)
{
    ctrl.Dock = DockStyle.Fill;
    ctrl.BackColor = Color.Red;
}

tlpBar он TableLayoutPanel и Settings.Default.target это цель доказательств, которые должны делаться.

Конечно проблема лежит в new Panel[Settings.Default.target], потому что я попробовал делать это с tlpBar.Controls.Add(new Panel()); и да оно функционировало, но не с AddRange и все панели.

И также я не могу делать, что колонны TableLayoutPanel будьте распространены во всем бруске с тем же размером.

1
задан 18.06.2017, 03:52
1 ответ

EncontrГ© лучшая форма давно, но olvidГ© помещать ее. Я это сделал с одним PictureBox и он рисовал прямоугольники в зависимости от времени, что продолжалось доказательство.

private void timeLines_Paint(object sender, PaintEventArgs e)
{
    PictureBox timeLine = (PictureBox)sender;

    for (int i = 0; i < testDataArray.Length; i++)
    {
        TimeSpan startTimeDistance = testDataArray[i].startDateTime - shiftStart;
        TimeSpan endTimeDistance = testDataArray[i].endDateTime - shiftStart;
        float startBlock = (float)(startTimeDistance.TotalHours * timeLine.Width / HPT);
        float endBlock = (float)((endTimeDistance.TotalHours * timeLine.Width / HPT));
        e.Graphics.FillRectangle(testDataArray[i].brush, startBlock, 0, endBlock - startBlock, timeLine.Height);
        e.Graphics.DrawLine(new Pen(Color.Black, 1), startBlock, 0, startBlock, timeLine.Height);
        e.Graphics.DrawLine(new Pen(Color.Black, 1), endBlock, 0, endBlock, timeLine.Height);

    }
}
  • testDataArra - договоренность, где у меня есть час, в котором empezГі и terminГі доказательство и цвет, с которым нужно рисовать.
  • shiftStart - пора, в котором он начинается меня lГ-nea времени.
  • HPT - часы, которые он представляет я lГ-nea времени в общем количестве.

ExplicaciГіn шаг за шагом:

В этой части вычислил время, которое переместило с тех пор, как empezГі я lГ-nea со времени до часа в, что comenzГі доказательство. Это, чтобы знать, в котором блок времени меня lГ-nea времени estГЎ доказательство.

TimeSpan startTimeDistance = testDataArray[i].startDateTime - shiftStart;
TimeSpan endTimeDistance = testDataArray[i].endDateTime - shiftStart;

В этой части я делаю ее conversiГіn из времени в пиксели, чтобы мочь рисовать это в PictureBox. Это простое правило 3.

float startBlock = (float)(startTimeDistance.TotalHours * timeLine.Width / HPT);
float endBlock = (float)((endTimeDistance.TotalHours * timeLine.Width / HPT));

В этой части уже я делаю рисунок rectГЎngulo и Ваш контур:

e.Graphics.FillRectangle(testDataArray[i].brush, startBlock, 0, endBlock - startBlock, timeLine.Height);
e.Graphics.DrawLine(new Pen(Color.Black, 1), startBlock, 0, startBlock, timeLine.Height);
e.Graphics.DrawLine(new Pen(Color.Black, 1), endBlock, 0, endBlock, timeLine.Height);
0
ответ дан 24.11.2019, 08:15