2008-12-03 16 views
19

Wiążę listę do DataGridView. Jedną z właściwości klasy SomeObject będzie kod statusu (np. Czerwony, żółty, zielony). Czy mogę łatwo "związać" status z kolorem tła komórki? Co powiesz na wiązanie z podpowiedziami?Powiązanie z DataGridView - czy istnieje sposób "powiązania" koloru tła komórki?

+0

Naprawdę mam nadzieję, że dostaniesz odpowiedź na to, i że to jest możliwe, nie byłem w stanie tego rozgryźć, ustawiłem kolor tła po wiązaniu danych przez zmianę każdego stylu komórki. Niestety to jest naprawdę powolne :(datagridview1.Rows [1] .Cells [2] .Style.BackColor = Color.Red –

Odpowiedz

35

Można napisać procedurę obsługi zdarzenia CellFormatting DataGridView w celu dostosowania koloru tła. Oto obrobionych przykład (musisz być przeciągnięty DataGridView na domyślnym formularzu następnie dwukrotnym kliknięciu na razie CellFormatting aby utworzyć uchwyt):

using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private BindingSource _source = new BindingSource(); 

     public Form1() 
     { 
      InitializeComponent(); 

      _source.Add(new MyData(Status.Amber, "Item A")); 
      _source.Add(new MyData(Status.Red, "Item B")); 
      _source.Add(new MyData(Status.Green, "Item C")); 
      _source.Add(new MyData(Status.Green, "Item D")); 

      dataGridView1.DataSource = _source; 
      dataGridView1.Columns[0].Visible = false; 
     } 

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
     { 
      if (e.ColumnIndex == 1) 
      { 
       DataGridView dgv = sender as DataGridView; 
       MyData data = dgv.Rows[e.RowIndex].DataBoundItem as MyData; 

       switch (data.Status) 
       { 
        case Status.Green: 
         e.CellStyle.BackColor = Color.Green; 
         break; 
        case Status.Amber: 
         e.CellStyle.BackColor = Color.Orange; 
         break; 
        case Status.Red: 
         e.CellStyle.BackColor = Color.Red; 
         break; 
       } 
      } 
     } 
    } 

    public class MyData 
    { 
     public Status Status { get; set; } 
     public string Text { get; set; } 

     public MyData(Status status, string text) 
     { 
      Status = status; 
      Text = text; 
     } 
    } 

    public enum Status 
    { 
     Green, 
     Amber, 
     Red 
    } 
} 

Obiekty tu właśnie mają status i tekstu dla prostoty . Tworzę BindingSource dla przykładowego zestawu tych obiektów, a następnie używam go jako źródła danych dla DataGridView. Domyślnie siatka automatycznie generuje kolumny po związaniu, więc nie ma potrzeby robienia tego ręcznie. Ukrywam też pierwszą kolumnę, która jest związana z wartością Statusu, ponieważ zamiast tego będziemy kolorować komórki Tekstu.

Aby faktycznie wykonać obraz, odpowiadamy na zdarzenie CellFormatting. Dostajemy odwołanie do DataGridView przez odlewanie nadawcy, a następnie używamy właściwości RowIndex obiektu DataGridViewCellFormattingEventArgs, aby uzyskać sam element danych (każdy wiersz ma właściwość DataBoundItem, która nam to wygodnie daje). Ponieważ DataBoundItem jest typem obiektu, musimy go rzucić na nasz konkretny typ, wtedy możemy faktycznie dostać się do samej właściwości Statusu ... Uff!

Nie miałem żadnego doświadczenia z programowaniem narzędzi, ale pomyślałem, że powinieneś zareagować na zdarzenie MouseHover, a następnie pracować nad odkryciem, który wiersz jest wskazywany, aby zacząć.

Mam nadzieję, że to pomoże.

+0

Dobra odpowiedź - dziękuję – xyz

+1

+1, Świetna odpowiedź Znalazłem ostatni wiersz był pusty wiersz, więc musiał sprawdzić, czy MyData była zerowa.Od tego świetnie! – Russell

+0

Działa to świetnie, tylko pytanie, czy istnieje sposób, aby zrobić ten wiersz na raz, zamiast komórki.Zainteresowanie, czy istnieje wydajność uderzył, gdy masz 1000+ wierszy, 10+ kolumn. – Sint

2

Po wyjęciu z pudełka dowolna kolumna DataGridViewColumn może być powiązana tylko z jedną właściwością obiektów w DataSource, nazwa właściwości jest nadawana przez właściwość DataPropertyName każdej kolumny DataGridViewColumn (będziesz mieć określone typy kolumn, takie jak: DataGridViewTextBoxColumn, ...).

Można użyć zdarzenia DataGridView.CellFormatting, aby zmienić styl komórki w zależności od elementu databound. W polu DataGridViewCellFormattingEventArgs tego zdarzenia pojawi się indeks wiersza, z którego można pobrać bieżący obiekt (źródło wiersza). Stamtąd możesz użyć dowolnej właściwości obiektu, aby wpłynąć na twoją komórkę.

Dobrym punktem wyjścia (podobny pomysł): here

Drugim pomysłem byłoby rozwijają swój własny rodzaj DataGridViewColumn i dodać właściwości do innych rzeczy potrzebnych do związania. Na przykład w ten sam sposób, w jaki ma wbudowaną nazwę DataPropertyName, możesz dodać własną: BackgroundColorPropertyName. Punkt wyjścia do budowania niestandardowych DataGridViewColumns można znaleźć here.

Powiązane problemy