使用窗口应用程序中的数据表或数据集在gridview中添加进度条

我需要在WinForms应用程序中使用DataTable或DataSet在DataGridView中添加进度条,类似于:

进度栏栏

我找到的所有地方都有如下代码:

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

并赋值:

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

但我需要这个进度条在DataTable或DataSet中。

所以这是msdn的例子,有一些修正。 我使用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); } 

没有DataGridViewProgressColumn这样的东西。 获取实际的ProgressBar列将需要一些工作 – 这是一个嵌入在单元格内的ProgressBar

实现所需内容的最简单方法是在相关单元格中包含动画.gif文件,因此在这种情况下,您将使用DatGridViewImageColumn并使用“PictureBox”选择所需的动画.gif作为图像。

要顺利完成,需要multithreading处理您希望显示进度的过程。 如何做到这一点的基本纲要是

  1. 从这个神奇的网站中选择您的动画.gif文件。

  2. Timer导入表单并将计时器间隔设置为“50”。

  3. 在表单上创建一个图片框,并将其大小设置为“1,1”(非常小),将图像源设置为动画.gif。

  4. 选择此PictureBox作为DatGridViewImageColumn源图像。

然后包含以下代码

 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); } 

这将创建动画进度图像。 现在您需要担心的是没有在UI线程上工作,因为这将导致动画与其他所有内容一起释放!

我希望这有帮助。