Вопрос по c# – Добавить индикатор выполнения в gridview, используя набор данных или набор данных в оконном приложении

2

Мне нужно добавить индикатор выполнения в DataGridView, используя DataTable или DataSet в приложении WinForms, похожем на это:

progress bar column

Везде, где я обнаружил, есть такой код:

DataGridViewProgressColumn column = new DataGridViewProgressColumn();
column.HeaderText = "Status";
dataGridView1.Columns.Add(column);

и присвоить значение с помощью:

object[] row1 = new object[]  { "test1", "test2", 50 };

Но мне нужен этот индикатор в DataTable или DataSet.

да Likurg увидеть это изображениеi.stack.imgur.com/yZHY7.png и мне нужно то же самое, но с использованием динамических значений .. и динамического связывания datagridview. andy

Ваш Ответ

2   ответа
0

DataGridViewProgressColumn, Чтобы получить актуальныйProgressBar колонка займет определенную работу - этоProgressBar это встроено в клетку ...

Самый простой способ добиться чего-то похожего на то, что вы хотите - это создать анимированный файл .gif в соответствующей ячейке, поэтому в этом случае вы должны использоватьDatGridViewImageColumn и выберите необходимый анимационный файл .gif в качестве изображения, используя PictureBox.

Чтобы сделать гладко, потребуется многопоточность процесса, который вы хотите показать прогресс. Основная схема того, как это сделать, будет

Choose your animated .gif file from this amazing site.

Import a Timer into your form and set the timer interval as '50'.

Create a picture box on you form and set its size to "1, 1" (very small) and the image source to your animated .gif.

Select this PictureBox as the DatGridViewImageColumn source image.

Затем включите следующий код

private void yourTimerForGifAnimation_Tick(object sender, EventArgs e)
{
    this.dataGridView1.Rows[someRow].Cells["My Progress Bar Column"].Value = 
        this.pictureBoxGif.Image            
    this.dataGridView1.InvalidateCell(cellColumnIndex, cellRowIndex);
}

Это создаст ваше анимированное изображение прогресса. Теперь все, о чем вам нужно беспокоиться, это не выполнять работу с потоком пользовательского интерфейса, поскольку это приведет к бесплатной анимации вместе со всем остальным!

Надеюсь, это поможет.

5

с некоторыми исправлениями. Я использую Datagridview, Timer, Button.

Теперь вам нужно использовать поток для ваших вычислений. Я надеюсь, это поможет.

 public class DataGridViewProgressColumn : DataGridViewImageColumn
    {
        public DataGridViewProgressColumn()
        {
            CellTemplate = new DataGridViewProgressCell();
        }
    }

    class DataGridViewProgressCell : DataGridViewImageCell
    {
        // Used to make custom cell consistent with a DataGridViewImageCell
        static Image emptyImage;
        static DataGridViewProgressCell()
        {
            emptyImage = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        }
        public DataGridViewProgressCell()
        {
            this.ValueType = typeof(int);
        }
        // Method required to make the Progress Cell consistent with the default Image Cell. 
        // The default Image Cell assumes an Image as a value, although the value of the Progress Cell is an int.
        protected override object GetFormattedValue(object value,
                            int rowIndex, ref DataGridViewCellStyle cellStyle,
                            TypeConverter valueTypeConverter,
                            TypeConverter formattedValueTypeConverter,
                            DataGridViewDataErrorContexts context)
        {
            return emptyImage;
        }

        protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            int progressVal = 0;

            if (value != null)
                progressVal = (int)value;

            float percentage = ((float)progressVal / 100.0f); // Need to convert to float before division; otherwise C# returns int which is 0 for anything but 100%.
            Brush backColorBrush = new SolidBrush(cellStyle.BackColor);
            Brush foreColorBrush = new SolidBrush(cellStyle.ForeColor);
            // Draws the cell grid
            base.Paint(g, clipBounds, cellBounds,
             rowIndex, cellState, value, formattedValue, errorText,
             cellStyle, advancedBorderStyle, (paintParts & ~DataGridViewPaintParts.ContentForeground));
            if (percentage > 0.0)
            {
                // Draw the progress bar and the text
                g.FillRectangle(new SolidBrush(Color.FromArgb(163, 189, 242)), cellBounds.X + 2, cellBounds.Y + 2, Convert.ToInt32((percentage * cellBounds.Width - 4)), cellBounds.Height - 4);
                g.DrawString(progressVal.ToString() + "%", cellStyle.Font, foreColorBrush, cellBounds.X + 6, cellBounds.Y + 2);
            }
            else
            {
                // draw the text
                if (this.DataGridView.CurrentRow.Index == rowIndex)
                    g.DrawString(progressVal.ToString() + "%", cellStyle.Font, new SolidBrush(cellStyle.SelectionForeColor), cellBounds.X + 6, cellBounds.Y + 2);
                else
                    g.DrawString(progressVal.ToString() + "%", cellStyle.Font, foreColorBrush, cellBounds.X + 6, cellBounds.Y + 2);
            }
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DataGridViewProgressColumn column = new DataGridViewProgressColumn();
        dataGridView1.Columns.Add(new DataGridViewProgressColumn());
        dataGridView1.Rows.Add("Row 1", 10);
        dataGridView1.Rows.Add("Row 2", 50);
        dataGridView1[1, 0].Value = 10;
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        Random r=new Random();
        dataGridView1[1, 0].Value = r.Next(0, 100);
        dataGridView1[1, 1].Value = r.Next(0, 100);
    }
Error: User Rate Limit Exceeded

Похожие вопросы