2011-01-23 14 views
0

私は、私がやってはならないことを知っている多くのものをやっているdatagridviewを持っています。ご存知のとおり、要件に従ってください。Datagridviewの背景色は、SECONDデータバインドに表示されます

これらの要件の1つは、特定の値に応じて各行の特定のセルをカラー化することです。私はETAと承認フィールドでこれをやっています。どちらも通常、このコードが実行されるまで時間働いています。一部の行では、承認済みフィールドの場合にのみ、決しては、アプリケーション全体を再起動するまで色付けされます。なぜこれが起こるのですか?

  • 私はすべての参照データが実際に存在することを確認しました。
  • 私は以下のカラーラインが実際にヒットしたことを確認しました。

Winformsの/ .NET 3.5

List<int> 
    ClinicIDs = new List<int>(), 
    ZoneIDs = new List<int>(); 
foreach (Clinic c in lb_Clinics_RM.SelectedItems) 
    ClinicIDs.Add(((Clinic)c).ID); 
foreach (Zone z in lb_Zones_RM.SelectedItems) 
    ZoneIDs.Add(((Zone)z).ID); 

if (lb_Clinics_RM.SelectedItems.Count == 0) 
    foreach (Clinic c in lb_Clinics_RM.Items) 
     ClinicIDs.Add(((Clinic)c).ID); 
if (lb_Zones_RM.SelectedItems.Count == 0) 
    foreach (Zone z in lb_Zones_RM.Items) 
     ZoneIDs.Add(((Zone)z).ID); 

dgRides.DataSource = from r in dc.Rides 
        where ((DateTime)r.ApptDatetime).Date == dtRides.Value.Date 
         && (ZoneIDs.Contains((from c in r.Location.Clinics select c.Zone.ID).FirstOrDefault()) 
          || ZoneIDs.Contains((from c in r.Location1.Clinics select c.Zone.ID).FirstOrDefault())) 
         && (ClinicIDs.Contains((from c in r.Location.Clinics select c.ID).FirstOrDefault()) 
          || ClinicIDs.Contains((from c in r.Location1.Clinics select c.ID).FirstOrDefault())) 
        orderby r.isRejected descending, r.ApptDatetime.Value, r.isApproved, r.PatientID 
        select new 
        { 
         r.ID, 
         PatientID = r.PatientID, 
         Approved = " ", 
         Appointment = r.ApptDatetime.Value.TimeOfDay, 
         RideID = r.ID, 
         ETA = r.ETA.TimeOfDay, 
         Clinic = (from c in dc.Clinics where c.Location.ID == r.Location.ID || c.Location.ID == r.Location1.ID select c).FirstOrDefault().Name, 
         Direction = (r.ApptDuration == 0 ? "Outbound" : "Inbound"), 
         LastName = r.Patient.LastName, 
         FirstName = r.Patient.FirstName, 
         From = r.Location.Clinics.Count() > 0 ? r.Location.Clinics.First().Name : r.Location.Address, 
         To = r.Location1.Clinics.Count() > 0 ? r.Location1.Clinics.First().Name : r.Location1.Address, 
         Driver = r.Driver.Name == "Unassigned" ? "" : r.Driver.Name, 
         Vehicle = r.Driver.Name == "Unassigned" ? "" : r.Driver.Vehicle.VehicleNumber 
        }; 

if (dgRides.Columns.Count == 0) 
    return; 



// Format displayed rides 
foreach (DataGridViewRow dr in dgRides.Rows) 
{ 
    if (dr.Index == -1) continue; 
    Ride ride; 
    try { ride = (from r in dc.Rides where r.ID == ((int)dr.Cells[0].Value) select r).First(); } 
    catch { continue; } 

    TimeSpan diff = ride.ETA - ride.ApptDatetime.Value; 
    Color fore; 
    dr.Cells["ETA"].Style.BackColor = Common.GetColorByLateness(diff.Minutes, out fore); 
    dr.Cells["ETA"].Style.ForeColor = fore; 


    if (ride.isApproved) 
     dr.Cells["Approved"].Style.BackColor = Color.Green; 
    else if (ride.isRejected) 
     dr.Cells["Approved"].Style.BackColor = Color.Red; 
} 

public static Color GetColorByLateness(int MinutesLate, out Color Foreground) 
{ 
    int 
     ETAYellowMinutes = int.Parse(Lookups.GetSetting("ETAYellowMinutes")), 
     ETARedMinutes = int.Parse(Lookups.GetSetting("ETARedMinutes")); 

    Foreground = Color.White; 

    if (MinutesLate > ETARedMinutes) 
     return Color.DarkRed; 
    else if (MinutesLate > ETAYellowMinutes) 
     return Color.FromArgb(100, 100, 0); 
    else 
     return Color.Green; 
} 

答えて

0

私がバインドしていたオブジェクトは、リフレッシュする必要がありました。奇妙なことに、遅延実行はバインド時に評価されるはずです。しかし、datacontext.refresh()を実行することでそれが修正されました。

+0

このdatacontextオブジェクトは何ですか?私はSqlDataAdapterからDataTableを介してデータを取得するdatagridviewで同じ問題を抱えています。 – Derar

2

は、なぜあなたはCellFormattingイベントを使用していませんか? See this post

+0

修正しませんでした。 – tsilb

関連する問題