2008-12-03 2 views
19

Я привязываю список к DataGridView. Одним из свойств класса SomeObject будет код состояния (например, красный, желтый, зеленый). Могу ли я «привязать» статус к цвету фона ячейки легко? Как насчет привязки к всплывающей подсказке?Связывание с DataGridView. Есть ли способ «привязать» цвет фона ячейки?

+0

Я действительно надеюсь, что вы получите ответ на этот вопрос, и, возможно, я не смог понять это, я установил цвет фона после привязки данных, изменив стиль каждой ячейки. К сожалению, это очень медленно :(datagridview1.Rows [1] .Cells [2] .Style.BackColor = Color.Red – 2008-12-04 08:30:06

ответ

35

Вы можете написать обработчик события CellFormatting DataGridView для настройки цвета фона. Вот обработанный пример (вам нужно затащили в DataGridView на форму по умолчанию затем дважды щелкнули на событии CellFormatting создать обработчик):

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 
    } 
} 

Объектов здесь просто имеют статус и текст для простоты , Я создаю BindingSource для примера набора этих объектов, а затем использую это как источник данных для DataGridView. По умолчанию сетка автоматически создает столбцы при связывании, поэтому нет необходимости делать это вручную. Я также скрываю первый столбец, который привязан к значению состояния, поскольку мы будем окрашивать ячейки Text вместо этого.

Чтобы сделать картину, мы отвечаем на событие CellFormatting. Мы получаем ссылку на DataGridView, отправляя отправителя, а затем используем свойство RowIndex объекта DataGridViewCellFormattingEventArgs, чтобы добраться до самого элемента данных (каждый Row имеет свойство DataBoundItem, которое нам удобно это дает). Поскольку DataBoundItem является типом объекта, нам нужно отнести его к нашему конкретному типу, тогда мы можем фактически получить свойство Status ... phew!

У меня не было опыта программирования всплывающих подсказок, но я бы подумал, что вам следует ответить на событие MouseHover, а затем поработать над обнаружением того, на какую строку указывают, для начала.

Надеюсь, это поможет.

+0

Хороший ответ - спасибо. – xyz 2009-03-11 12:21:45

2

В любом случае любой объект DataGridViewColumn может быть привязан только к одному объекту в объекте DataSource, имя свойства, задаваемое DataPropertyName каждой DataGridViewColumn (у вас будут конкретные типы столбцов, такие как: DataGridViewTextBoxColumn, ...).

Вы можете использовать событие DataGridView.CellFormatting, чтобы изменить стиль ячейки в зависимости от элемента привязки данных. В InDataGridViewCellFormattingEventArgs этого события вы получаете индекс строки, оттуда вы можете получить текущий объект (источник строки). Оттуда вы можете использовать любое свойство объекта, чтобы влиять на вашу ячейку.

Хорошая отправная точка (подобная идея): here

Вторая идея будет действительно развивать свой собственный тип DataGridViewColumn и добавить свойства для других вещей, которые нужно связать с. Например, так же, как и встроенное имя DataPropertyName, вы можете добавить свой собственный: BackgroundColorPropertyName. Отправной точкой для создания пользовательских DataGridViewColumns можно найти here.

Смежные вопросы