c# - 使用文本和 ProgressBars 填充 DataGridView

标签 c# winforms multithreading datagridview progress-bar

我正在创建一个多线程应用程序,其中每个线程都将在我的 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);
}

这是结果

alt text

关于c# - 使用文本和 ProgressBars 填充 DataGridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4646920/

相关文章:

c# - 尝试在 c# 中创建一个 "if"语句,以便如果字符串大于 int,它会显示一条消息

c# - 从不同的文件夹渲染部分(不共享)

c# - 保存多个复选框的状态并在应用程序启动时重新加载它们

c# - 用于将 Windows 应用程序连接到 MVC 4 的 Web 服务或 Web API?

c# - 当绑定(bind)源正确时,DataGridView 在 C# 中不更新

c# - 在完成所有登录过程后如何获得 ExternalIdentity?

multithreading - 如何在 perl 中创建同步方法?

java - 使用Java.Thread向MySQL数据库插入数据安全吗?

c - sighandler 中的问题

c# - 安全异常 ASP.NET/MySQL