使用文本和进度条填充 DataGridView

Posted

技术标签:

【中文标题】使用文本和进度条填充 DataGridView【英文标题】:Populating a DataGridView with Text and ProgressBars 【发布时间】:2011-06-06 12:35:00 【问题描述】:

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

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

【问题讨论】:

datagridview 中进度条单元格的 MSDN 示例代码:social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/… 之后我在多线程中看不到任何问题。 【参考方案1】:

我添加了类 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);


这是结果

【讨论】:

答案很有用,不过第一部分的源码应该归功于MSDN:social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/… 如果您收到错误Specified cast is not valid.,则将progressVal = (int)value 替换为progressVal = Convert.ToInt32(value)【参考方案2】:
<DataGridTemplateColumn Header="Progress" Width="*" Visibility="Visible">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
    <StackPanel>
        <TextBlock Text="Binding Progress" HorizontalAlignment="Center" />
        <ProgressBar Value="Binding Path=Progress, Mode=OneWay,UpdateSourceTrigger=PropertyChanged" Minimum="0" Maximum="100" Height="25" />
    </StackPanel>
</DataTemplate>

这对你有帮助

【讨论】:

@frzsombor 是的,没有用的答案。问题被标记为 Windows 窗体而不是 WPF。恕我直言,最好删除问题。

以上是关于使用文本和进度条填充 DataGridView的主要内容,如果未能解决你的问题,请参考以下文章

cocoscreator之微信小游戏的进度条(填充模式)

基于JQuery的进度条实现

使用 CSS 慢慢地用颜色填充 SVG 图像(如进度条)

加载数据并填充到recyclerview时如何显示进度条?

进度条填充表单输入

即使 FirebaseListAdapter 中没有要填充的视图,如何关闭进度条?