我需要在一个类似的WinForms应用程序使用数据表或数据集的DataGridView中添加一个进度条:
到处我发现有类似的代码:
DataGridViewProgressColumn column = new DataGridViewProgressColumn();
column.HeaderText = "Status";
dataGridView1.Columns.Add(column);
并分配与价值:
object[] row1 = new object[] { "test1", "test2", 50 };
但我需要这个进度条是在一个DataTable或数据集。
因此,这是例如从MSDN,具有一定的修正。 我使用的DataGridView,定时器,按钮。
现在,你需要使用线程的计算。 我希望这将有所帮助。
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
并选择所需的动画.gif注意:如使用`图片框”的形象。
要做到顺利将需要多线程,你希望显示的进展过程。 如何做到这一点的基本轮廓是
选择您的动画.gif文件这个惊人的网站 。
导入Timer
到表单中并设置计时器的时间间隔为“50”。
创建一个图片框你形成并设置其大小为“1,1”(非常小)和图像源到你的动画.gif注意。
选择此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线程,因为这工作会导致动画与其他一切自由沿!
我希望这有帮助。
文章来源: Add progress bar in gridview using datatable or dataset in window application