使用Text和ProgressBars填充DataGridView

我正在创建一个multithreading应用程序,其中每个线程将在我的DataGridView显示为一行。 我希望每行中有一个ProgressBar ,表示相应的线程进度。

问题是,这可能吗? 如果是这样,怎么样?

我添加了类DataGridViewProgressColumn.cs (来源: MSDN )

 using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using System.Drawing; using System.ComponentModel; namespace Sample { public class DataGridViewProgressColumn : DataGridViewImageColumn { public DataGridViewProgressColumn() { CellTemplate = new DataGridViewProgressCell(); } } } namespace Sample { 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) { try { int 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(203, 235, 108)), cellBounds.X + 2, cellBounds.Y + 2, Convert.ToInt32((percentage * cellBounds.Width - 4)), cellBounds.Height - 4); g.DrawString(progressVal.ToString() + "%", cellStyle.Font, foreColorBrush, cellBounds.X+(cellBounds.Width/2)-5, 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); } } catch (Exception e) { } } } } 

然后我使用该代码填充GridView

 DataGridViewProgressColumn column = new DataGridViewProgressColumn(); kryptonDataGridView1.ColumnCount = 2; kryptonDataGridView1.Columns[0].Name = "TESTHeader1"; kryptonDataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; kryptonDataGridView1.Columns[1].Name = "TESTHeader22"; kryptonDataGridView1.Columns[1].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; kryptonDataGridView1.Columns.Add(column); kryptonDataGridView1.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; column.HeaderText = "Progress"; object[] row1 = new object[] { "test1", "test2", 50 }; object[] row2 = new object[] { "test1", "test2", 55 }; object[] row3 = new object[] { "test1", "test2", 22 }; object[] rows = new object[] { row1, row2, row3 }; foreach (object[] row in rows) { kryptonDataGridView1.Rows.Add(row); } 

这是结果

替代文字

         

这有助于你