Подтвердить что ты не робот

Связывание с DataGridView. Есть ли способ "привязать" цвет фона ячейки?

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

4b9b3361

Ответ 1

Вы можете написать обработчик для события 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, поскольку мы будем раскрашивать ячейки Text вместо этого.

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

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

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

Ответ 2

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

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

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

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