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