2016-06-20 9 views
-1

これは可能ですか?私は現在、色を変更するために各行をループしていますが、これも非常に遅いです。私はクエリを実行しており、結果に基づいて色を変更しています。ここでは例特定の値を含むすべてのdatagridview行の色を変更してください

Part No | Other Columns 
----------------------- 
Part A | 123456 
Part B | 123456 
Part C | 123456 
Part A | 123456 
Part A | 123456 

だ私のクエリのどこWhere Part_No = 'Part A'は、私はちょうど同じクエリを3回実行していることになる私の現在の方法で、です。私がしたいのは、最初の列に別個の値を取得し、クエリ内の値をチェックし、その値を含む行の色を変更することです。

+0

dgvはDataTableのようなものにバインドされていますか? WHERE句がPart_No = 'Part A''の場合、Part BとCはそこで何をしていますか? – Plutonix

+0

@Plutonix申し訳ありませんが、私はそれがはっきりしないと思います。はい、datagridviewはデータソースにバインドされています。私が述べたwhere節は、私が各行をループしているときのクエリのためのものです。 – crimson589

答えて

0

はここに答えた:私はちょうど(私はこの質問をほぼ3年前に出版されたけど、多分それが誰かを助ける...)この問題を調査していたHow to change row color in datagridview?

===

をが、より良い選択肢は、すべての行、塗りつぶされたものだけをトラバースする必要がないように、コードをRowPrePaintイベントの内部に配置することです(大量のデータではパフォーマンスが向上します)。 イベントにアタッチする

this.dataGridView1.RowPrePaint 
    += new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
     this.dataGridView1_RowPrePaint); 
The event code 

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
{ 
    if (Convert.ToInt32(dataGridView1.Rows[e.RowIndex].Cells[7].Text) < Convert.ToInt32(dataGridView1.Rows[e.RowIndex]..Cells[10].Text)) 
    { 
     dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige; 
    } 
} 
0

経済的な方法は、CellFormattingイベントを使用することです。これは、そのセルが最初に表示されたときに起動します。それは可視の行に対してのみ発火するので、より速くなければなりません。

Then I loop through the grid view to do something like update the data of all colored rows

データをDBから来る場合には(OPクエリを言及)あなたは、データソースのようなデータに作用されるべきです。 DGVは、ユーザーのデータビューです。特定の色の行に作用するのではなく、部品番号や色を決めるものに基づいて行動します。プロセスの簡素化のために、この番号またはその部分番号を持つレコードのビューを作成し、それに対してact/loopを作成することもできます。データを変更することができますので

、あなたは2つのイベントを処理することをお勧めします:CellFormatting

Private Sub dgv1_CellFormatting(...) Handles dgv1.CellFormatting 
    ' default start up color 
    If e.ColumnIndex = 3 Then 
     e.FormattingApplied = ColorMyRow(e.RowIndex, e.ColumnIndex) 
    Else 
     e.FormattingApplied = False 
    End If 
End Sub 

Private Sub dgv1_CellValueChanged(...) Handles dgv1.CellValueChanged 
    ' if the target cell changes, update 
    If e.ColumnIndex = 3 Then 
     ColorMyRow(e.ColumnIndex, e.RowIndex) 
    End If 
End Sub 

' DRY 
Private Function ColorMyRow(rowIndex As Int32, colIndex As Int32) As Boolean 
    Dim bass As Color = Color.PeachPuff 
    Dim pike As Color = Color.SeaShell 
    Dim salmon As Color = Color.Salmon 

    Select Case dgv1.Rows(rowIndex).Cells(colIndex).Value.ToString 
     Case "Bass" 
      dgv1.Rows(rowIndex).DefaultCellStyle.BackColor = bass 
      Return True 
     Case "Pike" 
      dgv1.Rows(rowIndex).DefaultCellStyle.BackColor = pike 
      Return True 
     Case "Salmon" 
      dgv1.Rows(rowIndex).DefaultCellStyle.BackColor = salmon 
      Return True 
    End Select 

    Return False 
End Function 
色a)は、ユーザーがセルを編集するかどうか更新されます

CellValueChanged、B)あなたは、セルの値を変更します(dgv1.Rows(0).Cells(3).Value = "Mermaid")、またはc)データソース(dtParts.Rows(0)(3) = "Pike")を変更します。

青色の行にループしようとして

最後に、むしろそれから、あなたは、この場合には、DataTableDataSourceを照会することができます

Dim bassRows = dtSample.Select("Fish = 'Bass'") 
For Each dr As DataRow In bassRows 
    dr("Fish") = "Pike" 
Next 

色が自動的に変更されます。

+0

遅く返事を申し訳ありませんが、これを試すことに慣れていないのですが、これは表示された行の色のみに言及しているので、私はdatagridviewをループするとどのように動作し、行の色に依存します。 – crimson589

+0

ループする必要はありません。すべての行をループします。多くの行は表示されませんが、それは遅くなる原因となります。各行が表示にスクロールすると、イベントが発生し、バックカラーが設定されます。あなたは色に依存してはいけませんが、色を設定するのに同じ決定要因が使われています。 – Plutonix

+0

色が設定された後、私はループを繰り返すことを意味します。あなたのメソッドを使って、表示されている行が色付けされているとしましょう。次に、グリッドビューをループして、すべての色付きの行のデータを更新するような行を実行します。行は表示されませんが、色付きで更新されると思われますか? – crimson589

関連する問題