none
有關Winform DataGrid 裡面的Cell 要變換backcolor RRS feed

  • 問題

  • 請問大家一下

    小弟想把Datagrid 裡面的其中一個column 裡面的cell 變換backcolor.(顏色按照cell裡面的值(ARGB))但是不知道該如何下手.請問各位前輩能否提供意見給小弟  感激不盡

    2006年10月27日 上午 07:01

解答

  • VS2005可以這樣作:

    Private Sub DataGridView1_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete

            For index As Integer = 1 To DataGridView1.Rows.Count - 1
                If index = 1 Then
                    DataGridView1.Item(3, index).Style.ForeColor = Color.Red
                Else
                    DataGridView1.Item(3, index).Style.ForeColor = Color.Black
                End If
            Next

        End Sub

    2006年10月27日 上午 07:45
    版主
  • HI,

    VS 2003要製作一個類別, 如下:

    Class DataGridColorColumn
        Inherits DataGridTextBoxColumn

        Protected Overloads Overrides Sub Paint(ByVal graph As Graphics, ByVal rectbounds As Rectangle, ByVal curmngrSrc As CurrencyManager, ByVal RowNumber As Integer, ByVal ForeColorBrush As Brush, ByVal BackColorBrush As Brush, ByVal AlignmentRight As Boolean)
            Dim ObjVal As Object
            ObjVal = Me.GetColumnValueAtRow(curmngrSrc, RowNumber)

            If Not (IsNothing(ObjVal) Or IsDBNull(ObjVal)) Then
                Dim cellValue As Integer
                cellValue = CType(ObjVal, Integer)
                If (cellValue > 30) Then                                    '判斷欄位內容, 做為變化儲存格色彩的依據
                    BackColorBrush = Brushes.White
                    ForeColorBrush = Brushes.Red
                Else
                    BackColorBrush = Brushes.White
                    ForeColorBrush = Brushes.Blue
                End If
            End If

            MyBase.Paint(graph, rectbounds, curmngrSrc, RowNumber, BackColorBrush, ForeColorBrush, AlignmentRight)
        End Sub

    End Class

    再把做好的類別拿給DataGrid控制項使用:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            SqlDataAdapter1.Fill(Ds1)

            Dim ts As DataGridTableStyle = New DataGridTableStyle
            ts.MappingName = "Products"

            Dim colProductID As DataGridTextBoxColumn = New DataGridTextBoxColumn
            colProductID.MappingName = Ds1.Tables("Products").Columns(0).ColumnName
            colProductID.HeaderText = "產品代號"
            ts.GridColumnStyles.Add(colProductID)

            Dim colProductName As DataGridTextBoxColumn = New DataGridTextBoxColumn
            colProductName.Width = 180
            colProductName.MappingName = Ds1.Tables("Products").Columns(1).ColumnName
            colProductName.HeaderText = "產品名稱"
            ts.GridColumnStyles.Add(colProductName)

            Dim colUnitPrice As DataGridColorColumn = New DataGridColorColumn
            colUnitPrice.MappingName = Ds1.Tables("Products").Columns(2).ColumnName
            colUnitPrice.Format = "C"
            colUnitPrice.Alignment = HorizontalAlignment.Right
            colUnitPrice.HeaderText = "單價"
            ts.GridColumnStyles.Add(colUnitPrice)

            DataGrid1.TableStyles.Add(ts)
        End Sub

    tihs

     

    2006年10月27日 上午 11:41
  • HI,

    Brush有很多種, 包括:

             System.Drawing.Drawing2D.HatchBrush
             System.Drawing.Drawing2D.LinearGradientBrush
             System.Drawing.Drawing2D.PathGradientBrush
             System.Drawing.SolidBrush
             System.Drawing.TextureBrush

    您可以視需要選用可以設定顏色的Brush
    tihs
    2006年10月29日 上午 01:09
  • HI,

    您會不會是忘了引入必要的Namespace, 如果您要使用HatchBrush, 您必須在檔案的最前面引入:

    Imports System.Drawing.Drawing2D

    然後才可以這樣寫:

    BackColorBrush = New HatchBrush(HatchStyle.DashedHorizontal, Color.Blue, Color.Yellow)

    tihs

    2006年10月31日 上午 11:43
  • HI,

    不要使用DataGridTextBoxColumn, 改用DataGridBoolColumn即可

    tihs

    2006年11月3日 上午 12:58

所有回覆

  • VS2005可以這樣作:

    Private Sub DataGridView1_DataBindingComplete(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewBindingCompleteEventArgs) Handles DataGridView1.DataBindingComplete

            For index As Integer = 1 To DataGridView1.Rows.Count - 1
                If index = 1 Then
                    DataGridView1.Item(3, index).Style.ForeColor = Color.Red
                Else
                    DataGridView1.Item(3, index).Style.ForeColor = Color.Black
                End If
            Next

        End Sub

    2006年10月27日 上午 07:45
    版主
  • 感謝你的回覆.

    但是小弟是用2003... 好像用法不同.  還是謝謝您

    2006年10月27日 上午 08:32
  • HI,

    VS 2003要製作一個類別, 如下:

    Class DataGridColorColumn
        Inherits DataGridTextBoxColumn

        Protected Overloads Overrides Sub Paint(ByVal graph As Graphics, ByVal rectbounds As Rectangle, ByVal curmngrSrc As CurrencyManager, ByVal RowNumber As Integer, ByVal ForeColorBrush As Brush, ByVal BackColorBrush As Brush, ByVal AlignmentRight As Boolean)
            Dim ObjVal As Object
            ObjVal = Me.GetColumnValueAtRow(curmngrSrc, RowNumber)

            If Not (IsNothing(ObjVal) Or IsDBNull(ObjVal)) Then
                Dim cellValue As Integer
                cellValue = CType(ObjVal, Integer)
                If (cellValue > 30) Then                                    '判斷欄位內容, 做為變化儲存格色彩的依據
                    BackColorBrush = Brushes.White
                    ForeColorBrush = Brushes.Red
                Else
                    BackColorBrush = Brushes.White
                    ForeColorBrush = Brushes.Blue
                End If
            End If

            MyBase.Paint(graph, rectbounds, curmngrSrc, RowNumber, BackColorBrush, ForeColorBrush, AlignmentRight)
        End Sub

    End Class

    再把做好的類別拿給DataGrid控制項使用:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            SqlDataAdapter1.Fill(Ds1)

            Dim ts As DataGridTableStyle = New DataGridTableStyle
            ts.MappingName = "Products"

            Dim colProductID As DataGridTextBoxColumn = New DataGridTextBoxColumn
            colProductID.MappingName = Ds1.Tables("Products").Columns(0).ColumnName
            colProductID.HeaderText = "產品代號"
            ts.GridColumnStyles.Add(colProductID)

            Dim colProductName As DataGridTextBoxColumn = New DataGridTextBoxColumn
            colProductName.Width = 180
            colProductName.MappingName = Ds1.Tables("Products").Columns(1).ColumnName
            colProductName.HeaderText = "產品名稱"
            ts.GridColumnStyles.Add(colProductName)

            Dim colUnitPrice As DataGridColorColumn = New DataGridColorColumn
            colUnitPrice.MappingName = Ds1.Tables("Products").Columns(2).ColumnName
            colUnitPrice.Format = "C"
            colUnitPrice.Alignment = HorizontalAlignment.Right
            colUnitPrice.HeaderText = "單價"
            ts.GridColumnStyles.Add(colUnitPrice)

            DataGrid1.TableStyles.Add(ts)
        End Sub

    tihs

     

    2006年10月27日 上午 11:41
  • 不好意思 在請問一下

    brush 可以根據我自訂的顏色改變嗎

    因為我每個cell 都必須根據自己的值決定顏色

    2006年10月28日 上午 02:42
  • HI,

    類別是您寫的, 所以可以視狀況建立自己的Brush

    tihs

    2006年10月28日 上午 03:08
  • 我不是很了解.

    brush  的成員只有顏色. 不能讓我自己根據ARGB去設定顏色

    還是要另外改.  煩請賜教..

    2006年10月28日 上午 04:43
  • HI,

    Brush有很多種, 包括:

             System.Drawing.Drawing2D.HatchBrush
             System.Drawing.Drawing2D.LinearGradientBrush
             System.Drawing.Drawing2D.PathGradientBrush
             System.Drawing.SolidBrush
             System.Drawing.TextureBrush

    您可以視需要選用可以設定顏色的Brush
    tihs
    2006年10月29日 上午 01:09
  • 不好意思 .

    我試過其他的brush 但是都會出現錯誤訊息.

    是不是 override pain 只能用 brush.XXX

    2006年10月30日 上午 02:36
  • HI,

    您會不會是忘了引入必要的Namespace, 如果您要使用HatchBrush, 您必須在檔案的最前面引入:

    Imports System.Drawing.Drawing2D

    然後才可以這樣寫:

    BackColorBrush = New HatchBrush(HatchStyle.DashedHorizontal, Color.Blue, Color.Yellow)

    tihs

    2006年10月31日 上午 11:43
  • 感謝

    果然是忘了引入namespace

    謝謝您

     

    2006年11月1日 上午 09:33
  • 不好意思 又遇到問題了

    我的資料欄裡面有一個column 是boolean

    我直接這樣寫

     Dim colShipOrNot As DataGridTextBoxColumn = New DataGridTextBoxColumn
            colShipOrNot.MappingName = dvGetOrderInf.Table.Columns(15).ColumnName
            colShipOrNot.HeaderText = "已結掉"
            colShipOrNot.Alignment = HorizontalAlignment.Center
            dt.GridColumnStyles.Add(colShipOrNot)

    結果出來的是"False" 如果我想用  "O"  "X" 來顯示. 又應該如何改. 

    2006年11月2日 上午 05:58
  • HI,

    不要使用DataGridTextBoxColumn, 改用DataGridBoolColumn即可

    tihs

    2006年11月3日 上午 12:58
  • 請問一下,

    我依照tihs所說的方法去寫,是可以跑出來,但現在有個問題,如果有一欄不上色,上白色的話,在整行選取反藍時,那幾個上白色的欄位無法反藍,這是否有什麼好方法可以解決??

     

    2007年2月12日 上午 09:48
  • HI,

    您的意思是整欄被選取起來之後DataGridViewCheckBoxColumn無法反色嗎? 應該不會有這種現象的, 請問您是如何做的

    tihs

    2007年2月13日 上午 12:49
  • 我的做法是自己寫了一個Control,繼承System.Windows.Forms.DataGridBoolColumn

    然後我的介面再去使用我自己寫的Control.

    當我設定_isBlue為true時,則該行要上淡藍色,如果為False,希望保持原設定,但現在這樣子的做法,在整ROW選取時,正常會整ROW反藍,但_isBlue為False的那一欄並沒有反藍.

    我的Control程式碼如下:

    public class MyColorDataGridBoolColumn : System.Windows.Forms.DataGridBoolColumn
     {
      public MyColorDataGridBoolColumn()
      {
       
      }

    protected override void Paint(Graphics graph,Rectangle rectbounds,CurrencyManager curmngrSrc,int RowNumber,Brush ForeColorBrush,Brush BackColorBrush, bool AlignmentRight)
      {
       try
       {
        if (_isBlue==true)
        {
         BackColorBrush=Brushes.LightBlue;
        }
        else
        {
         BackColorBrush=SystemBrushes.Window;
         
        }
       }
       catch{}
       finally
       {
        base.Paint(graph,rectbounds,curmngrSrc,RowNumber,BackColorBrush,ForeColorBrush,AlignmentRight);

       }
      }

      public bool _isBlue=false;
      [Description("設定背景色為淡藍色")]
      public bool __isBlue
      {
       get
       {
        return _isBlue;
       }
       set
       {
        _isBlue = value ;
       }
      }

    }

    2007年2月13日 上午 01:14
  • HI, JEFF:

    Sorry, 不知道您用的是VS 2002, 如果您只是要一個打勾的欄位, 可以直接使用DataGridBoolColumn即可, 應該可以不需要另外製作類別.

    tihs

    2007年2月14日 上午 01:05
  • HI,

    該DataGridBoolColumn是還有其它功能,所以我是額外另寫一個,但只是背景色的問題,不知道要怎麼去解決.

    如果上白色,整ROW選取時,那一欄還會是白的,無法反藍.

    還是DataGridBoolColumn不用動到Paint,就可以直接設定背景色??

    2007年2月14日 上午 01:15
  • HI, Jeff:

    我這邊目前想到的辦法是在您的類別中override父類別的SelectedIndexChanged事件, 自行製作整列被選取時的背景顏色變換

    tihs

    2007年2月15日 上午 01:13
  • Hi tihs,

    請問override那一個物件的selectedindexChanged??

    我也有想過類似的做法,自行上色,但找不到較適合的事件來做,不然就是我點到那,顏色上到那,原選取變色的都沒有回復未選取的顏色,如果真的要做,就要多一些程式來控制選取時,顏色的變化.未被選取時,顏色要變回.

     

    2007年2月15日 上午 01:33
  • HI, Jeff

    應該是父類別, 也就是DataGridBoolColumn, 因為我這邊已經沒有VS2002, 所以不確定DataGridBoolColumn是否有公開selectedindexChanged事件供子類別 override.

    tihs

    2007年2月16日 上午 01:17
  • Hi, tihs

    我找了一下,沒有SelectedindexChanged的這個事件供override.

    看樣子,先來用嘴巴說服客人先.

     

    2007年2月16日 上午 01:31