Datagridviewで特定の行の色を変更したいです。 columncell 7の値がcolumncell 10の値よりも小さい場合、行を赤に変更する必要があります。これを達成する方法について何か提案はありますか?
Datagridviewの行をループ処理してから、各行の列7と10の値を比較する必要があります。
これを試して:
foreach (DataGridViewRow row in vendorsDataGridView.Rows)
if (Convert.ToInt32(row.Cells[7].Value) < Convert.ToInt32(row.Cells[10].Value))
{
row.DefaultCellStyle.BackColor = Color.Red;
}
私はこの問題を調査していたところなので(この質問はほぼ3年前に公開されていましたが、誰かに役立つかもしれませんが…)、コードをRowPrePaint
イベント内に配置するのが賢明です。 tすべての行をトラバースする必要があります。ペイントされた行だけを処理する必要があります。
イベントに添付
this.dataGridView1.RowPrePaint
+= new System.Windows.Forms.DataGridViewRowPrePaintEventHandler(
this.dataGridView1_RowPrePaint);
イベントコード
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;
}
}
CellFormatting
イベントを探しています。
ここ は一例です。
私もテキストの色を変えるのに苦労しました - 私は色の変化を見たことがありませんでした。
テキストの色をDataBindingsComplete
のイベントDataGridView
に変更するコードを追加するまでは。その後それは働いた。
私はこれが同じ問題に直面する人々を助けることを願っています。
次のようなものがあります。セルの値が整数であると仮定します。
foreach (DataGridViewRow dgvr in myDGV.Rows)
{
if (dgvr.Cells[7].Value < dgvr.Cells[10].Value)
{
dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
}
テストされていないので、エラーをお詫び申し上げます。
特定の行を知っていれば、反復をスキップできます。
if (myDGV.Rows[theRowIndex].Cells[7].Value < myDGV.Rows[theRowIndex].Cells[10].Value)
{
dgvr.DefaultCellStyle.ForeColor = Color.Red;
}
Paint
、CellPainting
、またはCellFormatting
のイベントを使用したい人もいますが、これらのイベントでスタイルを変更すると再帰呼び出しが発生することに注意してください。 DataBindingComplete
を使用すると、一度だけ実行されます。 CellFormatting
の引数は、表示されているセルに対してのみ呼び出されるため、表示されていないセルをフォーマットする必要はありませんが、複数回フォーマットすることです。
Backcolor
のDatasource
を適用した後、DatagridView
を自分の条件で行単位で変更することができます。
これがそのための関数です。単にそれをコピーしてDatabind
の後に置くだけです。
private void ChangeRowColor()
{
for (int i = 0; i < gvItem.Rows.Count; i++)
{
if (BindList[i].MainID == 0 && !BindList[i].SchemeID.HasValue)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#C9CADD");
else if (BindList[i].MainID > 0 && !BindList[i].SchemeID.HasValue)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#DDC9C9");
else if (BindList[i].MainID > 0)
gvItem.Rows[i].DefaultCellStyle.BackColor = ColorTranslator.FromHtml("#D5E8D7");
else
gvItem.Rows[i].DefaultCellStyle.BackColor = Color.White;
}
}
private void dtGrdVwRFIDTags_DataSourceChanged(object sender, EventArgs e)
{
dtGrdVwRFIDTags.Refresh();
this.dtGrdVwRFIDTags.Columns[1].Visible = false;
foreach (DataGridViewRow row in this.dtGrdVwRFIDTags.Rows)
{
if (row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Lost"
|| row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Damaged"
|| row.Cells["TagStatus"].Value != null
&& row.Cells["TagStatus"].Value.ToString() == "Discarded")
{
row.DefaultCellStyle.BackColor = Color.LightGray;
row.DefaultCellStyle.Font = new Font("Tahoma", 8, FontStyle.Bold);
}
else
{
row.DefaultCellStyle.BackColor = Color.Ivory;
}
}
//for (int i= 0 ; i<dtGrdVwRFIDTags.Rows.Count - 1; i++)
//{
// if (dtGrdVwRFIDTags.Rows[i].Cells[3].Value.ToString() == "Damaged")
// {
// dtGrdVwRFIDTags.Rows[i].Cells["TagStatus"].Style.BackColor = Color.Red;
// }
//}
}
これは、bindingDataSourceを使用して色をdataGridViewに変更する私のソリューションです。
private void dataGridViewECO_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (e.ListChangedType != ListChangedType.ItemDeleted)
{
DataGridViewCellStyle green = this.dataGridViewECO.DefaultCellStyle.Clone();
green.BackColor = Color.Green;
DataGridViewCellStyle gray = this.dataGridViewECO.DefaultCellStyle.Clone();
gray.BackColor = Color.LightGray;
foreach (DataGridViewRow r in this.dataGridViewECO.Rows)
{
if (r.Cells[8].Value != null)
{
String stato = r.Cells[8].Value.ToString();
if (!" Open ".Equals(stato))
{
r.DefaultCellStyle = gray;
}
else
{
r.DefaultCellStyle = green;
}
}
}
}
}
具象オブジェクトの(コレクション)にバインドすると、行のDataBoundItemプロパティを介してその具象オブジェクトを取得できます。 (セル内のマジックストリングのチェックとオブジェクトの「実際の」プロパティの使用を避けるため)
以下のスケルトンの例:
DTO/POCO
public class Employee
{
public int EmployeeKey {get;set;}
public string LastName {get;set;}
public string FirstName {get;set;}
public bool IsActive {get;set;}
}
Datagridviewへのバインド
private void BindData(ICollection<Employee> emps)
{
System.ComponentModel.BindingList<Employee> bindList = new System.ComponentModel.BindingList<Employee>(emps.OrderBy(emp => emp.LastName).ThenBy(emp => emp.FirstName).ToList());
this.dgvMyDataGridView.DataSource = bindList;
}
その後、イベントハンドラと具象オブジェクトを取得します(DataGridRowやセルの代わりに)。
private void dgvMyDataGridView_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
Employee concreteSelectedRowItem = this.dgvMyDataGridView.Rows[e.RowIndex].DataBoundItem as Employee;
if (null != concreteSelectedRowItem && !concreteSelectedRowItem.IsActive)
{
dgvMyDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.LightGray;
}
}
私は通常GridView.RowDataBoundイベントイベントをこれに使うのが好きです。
protected void OrdersGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.ForeColor = System.Drawing.Color.Red;
}
}
このコードでは、列名の値がnullである行のバックカラーのみを変更し、他の行の色はデフォルトのままです。
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Cells["columnname"].Value != null)
{
dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = Color.MistyRose;
}
}
DefaultCellStyle.BackColor
...を設定することについての単なるメモ。Color.Empty
以外の透明な値に設定することはできません。これがデフォルト値です。それは、透明な色が問題ないことを(私にはとにかく)誤って暗示しています。そうではありません。透明色に設定した各行は、選択された行の色だけを描画します。
私はこの問題で壁に頭をぶつけたのに全く時間をかけすぎました。
データバインディングを使用しない場合の解決策を探して、ここに着陸しました。私には何も機能しませんでしたが、私は最後にそれを得ました:
dataGridView.Columns.Clear();
dataGridView.Rows.Clear();
dataGridView.Refresh();
値がどのように変更されるかについては言及していません。ユーザーが値を入力しているとき、私は同様の機能を使いました。すなわち、編集モードに入ったり出たりする。
DatagridviewのCellEndEditイベントを使用する。
private void dgMapTable_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
double newInteger;
if (double.TryParse(dgMapTable[e.ColumnIndex,e.RowIndex].Value.ToString(), out newInteger)
{
if (newInteger < 0 || newInteger > 50)
{
dgMapTable[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.Red;
dgMapTable[e.ColumnIndex, e.RowIndex].ErrorText
= "Keep value in Range:" + "0 to " + "50";
}
}
}
同様の方法でエラー通知をクリアするためのロジックを追加することもできます。
あなたの場合、もしデータがプログラム的にロードされれば、そしてCellLeave eventは同じコードで使われることができます。
int counter = gridEstimateSales.Rows.Count;
for (int i = 0; i < counter; i++)
{
if (i == counter-1)
{
//this is where your LAST LINE code goes
//row.DefaultCellStyle.BackColor = Color.Yellow;
gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.Red;
}
else
{
//this is your normal code NOT LAST LINE
//row.DefaultCellStyle.BackColor = Color.Red;
gridEstimateSales.Rows[i].DefaultCellStyle.BackColor = Color.White;
}
}
Visual Studio 2010で動作します。(試してみましたが、動作します!)行全体がペイントされます。
datagridview
のボタンを作成します。CellClick
イベントを作成し、その中に次のコード行を入れます。if (dataGridView3.Columns[e.ColumnIndex].Index.Equals(0)
{
dataGridView3.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Beige;
}