2011-01-10 29 views
20

Estoy creando una aplicación multiproceso en la que cada subproceso aparecerá como una fila en mi DataGridView. Quiero un ProgressBar en cada fila indicando el progreso del hilo correspondiente.Rellenar un DataGridView con Text y ProgressBars

La pregunta es, ¿es esto posible? Y si es así, ¿cómo?

+2

MSDN código de ejemplo para la célula barra de progreso en DataGridView: http://social.msdn.microsoft.com/Forums/es-es/winformsdatacontrols/thread/769ca9d6-1e9d-4d76-8c23-db535b2f19c2 No veo ningún problema en el multihilo después de eso. –

Respuesta

29

que añade DataGridViewProgressColumn.cs clase (fuente: 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) { } 

    } 
} 
} 

Luego utiliza ese código para rellenar el 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); 
} 

Y él Re es el resultado

alt text

+7

La respuesta es muy útil, pero el código fuente de la primera parte se debe atribuir a MSDN: http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/769ca9d6-1e9d-4d76-8c23 -db535b2f19c2 –

-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> 

Esto le ayuda a

+0

@frzsombor Sí, NO es una respuesta útil. La pregunta está etiquetada como formularios de Windows no WPF. En mi humilde opinión, mejor eliminar la pregunta. – Kiquenet

Cuestiones relacionadas