Привязка к DataGridView - Является там способом “связать” цвет фона ячейки?

public class ActiveAlarm implements Comparable<ActiveAlarm> {
    public long timeStarted;
    public long timeEnded;
    private String name = "";
    private String description = "";
    private String event;
    private boolean live = false;

    public int compareTo(ActiveAlarm a) {
        if ( this.timeStarted > a.timeStarted )
            return 1;
        else if ( this.timeStarted < a.timeStarted )
            return -1;
        else {
             if ( this.timeEnded > a.timeEnded )
                 return 1;
             else
                 return -1;
        }
 }

Это должно дать вам приблизительную идею. Как только это будет сделано, вы можете вызвать Collections.sort() в списке.

19
задан Yaakov Ellis 4 December 2008 в 09:55
поделиться

2 ответа

Можно записать обработчик для события DataGridView's CellFormatting для настройки цвета фона. Вот обработанный пример (необходимо будет перетащить 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. По умолчанию сетка автоматически генерирует столбцы, когда Вы связываете, таким образом, нет никакой потребности сделать это вручную. Я также скрываю первый столбец, который связывается со значением Состояния, когда мы собираемся окрасить Текстовые ячейки вместо этого.

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

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

я надеюсь, что это помогает.

35
ответ дан 30 November 2019 в 03:34
поделиться

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

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

А хорошая начальная точка (подобная идея): здесь

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

2
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: