2011-01-10 33 views
20

私は各スレッドがDataGridViewの行として表示されるマルチスレッドアプリケーションを作成しています。対応するスレッドの進行状況を示す各行にProgressBarが必要です。DataGridViewにTextおよびProgressBarsを設定する

質問は、これは可能ですか?そしてもしそうなら、どうですか?

+2

MSDNのサンプルコード:http://social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/thread/769ca9d6-1e9d-4d76-8c23-db535b2f19c2それ以降のマルチスレッドでは何の問題もありません。 –

答えて

29

私はクラスDataGridViewProgressColumn.cs(ソース:MSDN)を加えそれから私は、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); 
} 

そして彼を移入するためにそのコードを使用

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) { } 

    } 
} 
} 

を結果

alt text

+7

答えは非常に便利ですが、最初の部分のソースコードは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> 

これはあなたの助けで再

のDataGridViewでのプログレスバーセル用
+0

@frzsomborええ、役に立つ答えはありません。質問は、WPFではなく、タグ付きのWindowsフォームです。 IMHO、より良い質問を削除します。 – Kiquenet

関連する問題