Soru DataGridView'ı Metin ve ProgressBars ile Doldurma


Her iş parçacığının bir satır olarak görünecek çok iş parçacıklı bir uygulama oluşturuyorum. DataGridView. Ben bir istiyorum ProgressBar Her satırda karşılık gelen iplik ilerlemesini gösterir.

Soru şu, bu mümkün mü? Ve eğer öyleyse, nasıl?


21
2018-01-10 12:41


Menşei


Datagridview'deki ilerleme çubuğu hücresi için MSDN örnek kodu: social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/... Bundan sonra çok iş parçacığında bir sorun görmüyorum. - default locale


Cevaplar:


DataGridViewProgressColumn.cs sınıfını ekledim (kaynak: 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) { }

    }
}
}

Sonra GridView'ı doldurmak için bu kodu kullandım

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

Ve sonuç burada

alt text


32
2018-01-10 14:20



Cevap çok kullanışlıdır, ancak ilk bölümün kaynak kodu MSDN'ye atfedilmelidir: social.msdn.microsoft.com/Forums/en-US/winformsdatacontrols/... - Mark Lakata


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

Bu size yardımcı olur


-3
2018-02-24 08:46



@frzsombor evet, yararlı bir cevap değil. Soru WPF değil windows formları olarak etiketlenmiştir. IMHO, soruyu daha iyi sil. - Kiquenet