Привязка к DataGridView - есть ли способ «привязать» цвет фона ячейки? - PullRequest
19 голосов
/ 04 декабря 2008

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

Ответы [ 2 ]

35 голосов
/ 04 декабря 2008

Вы можете написать обработчик для события 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. По умолчанию сетка автоматически генерирует столбцы при привязке, поэтому нет необходимости делать это вручную. Я также скрываю первый столбец, который привязан к значению Status, так как вместо этого мы собираемся закрасить текстовые ячейки.

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

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

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

2 голосов
/ 04 декабря 2008

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

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

Хорошая отправная точка (похожая идея): здесь

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

...