вопрос про DataGrid в .Net
http://www.google.com/search?hl=en&q=%D1%80%D0%B0%D1%81%...
Вопрос
Как раскрасить ячейки в DataGrid'e?
Ответ
Такая возможность будет доступна, если создать свой стиль столбца (производный, например, от DataGridTextBoxColumn) и в нем переопределить метод Paint. Каждый раз при вызове Paint будем генерировать событие, на которое должен подписаться "клиент", отвечающий за указание цвета заливки конкретной ячейки и после этого вызываем Paint базового класса.class ColoredTextBoxColumn: DataGridTextBoxColumn
{
//Определим класс аргумента события, делегат и само событие,
//необходимые для "общения" кода выполняющего прорисовку ячейки, с кодом,
//предоставляющим цвет для этой ячейки.
public class NeedBackgroundEventArgs: EventArgs
{
int rowNum;
public int RowNum
{
get
{
return rowNum;
}
}
public NeedBackgroundEventArgs(int rowNum, Brush brush)
{
this.rowNum = rowNum;
this.brush = brush;
}
Brush brush;
public Brush Brush
{
get
{
return brush;
}
set
{
brush = value;
}
}
}
public delegate void NeedBackgroundEventHandler(object sender,
NeedBackgroundEventArgs e);
public event NeedBackgroundEventHandler NeedBackground;
//А вот и переопределенный метод DataGridTextBoxColumn.Paint
//запрашивающий при помощи события (аргументов) цвет и передающий его
//базовому методу Paint в параметре backBrush.
//Теперь метод Paint базового класса будет заниматься прорисовкой ячейки,
//используя при этом подставленный нами backBrush.
protected override void Paint(Graphics g,
Rectangle bounds, CurrencyManager source,
int rowNum, Brush backBrush, Brush foreBrush,
bool alignToRight)
{
NeedBackgroundEventArgs e = new NeedBackgroundEventArgs(rowNum,
new SolidBrush(Color.White;
if (NeedBackground != null)
NeedBackground(this, e);
base.Paint(g, bounds, source, rowNum,
e.Brush, foreBrush, alignToRight);
}
}
Вот пример, использующий вновь созданный стиль столбца, здесь в DataGrid'e отображается столбец с названиями нескольких цветов, причем фон у ячеек, соответствует цвету:class ColoredGrid: Form
{
const string TABLE_NAME = "colors";
const string COLOR_NAME_COLUMN = "colorName";
enum SampleColors{Red, Green, Blue, Yellow, Orange, Brown};
DataTable dataTable;
DataGrid dataGrid;
static void Main
{
Application.Run(new ColoredGrid;
}
public ColoredGrid
{
FillDataTable;
dataGrid = new DataGrid;
dataTable.DefaultView.AllowEdit = false;
dataTable.DefaultView.AllowNew = false;
dataGrid.DataSource = dataTable;
dataGrid.Dock = DockStyle.Fill;
dataGrid.TableStyles.Add(GetTableStyle;
dataGrid.Parent = this;
}
//Создает и заполняет DataTable, в качестве столбца выступает имя цвета
void FillDataTable
{
dataTable = new DataTable(TABLE_NAME);
dataTable.Columns.Add(COLOR_NAME_COLUMN, typeof(string;
foreach(string colorName in Enum.GetNames(typeof(SampleColors
{
DataRow newRow = dataTable.NewRow;
newRow[COLOR_NAME_COLUMN] = colorName;
dataTable.Rows.Add(newRow);
}
}
//Создает и возвращает DataGridTableStyle
DataGridTableStyle GetTableStyle
{
ColoredTextBoxColumn coloredColumn = new ColoredTextBoxColumn;
coloredColumn.MappingName = COLOR_NAME_COLUMN;
coloredColumn.HeaderText = "Цвет";
coloredColumn.NeedBackground += new
ColoredTextBoxColumn.NeedBackgroundEventHandler(OnNeedBackround);
DataGridTableStyle tableStyle = new DataGridTableStyle;
tableStyle.MappingName = TABLE_NAME;
tableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[]
{coloredColumn});
return tableStyle;
}
//Обработчик события на запрос background'a
void OnNeedBackround(object sender,
ColoredTextBoxColumn.NeedBackgroundEventArgs e)
{
string colorName = (string)dataGrid[e.RowNum, 0];
e.Brush = new SolidBrush(Color.FromName(colorName;
}
}
Можно заметить, что при такой раскраске, когда фокус ввода помещен в какую-либо ячейку, background ячеки изменяется на цвет SystemColor.Window, вот что можно сделать чтобы избежать этого:
Та редактируемая ячейка в DataGrid'e - это единственный экземпляр TextBox'a (для каждого столбца свой который при выборе другой ячейки позиционируется на соответствующие координаты, поэтому нужно управлять background'ом именно этого TextBox'a. Чтобы было проще получить нужный TextBox (при наличии нескольких столбцов в DataGrid'e) опять-же можно воспользоваться классом, наследующим DataGridTextBoxColumn, у которого есть соответствующее свойство - TextBox, для которого и нужно проставлять соответствующий BackColor. Ниже пример, который это демонстрирует, в нем основной интерес представляет класс MyTextBoxStyle, все остальное - лишь для заполнения и создания DataGrid'a: using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
class MyTextBoxStyle: DataGridTextBoxColumn
{
public MyTextBoxStyle
{
backBrush = new SolidBrush(TextBox.BackColor);
}
Brush backBrush;
//Свойство, позволяющее получить доступ к цвету Background'a
public Color BackColor
{
get
{
return TextBox.BackColor;
}
set
{
backBrush = new SolidBrush(value);
TextBox.BackColor = value;
}
}
//Переопределяем Paint для вывода нужного background'a
protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source,
int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
{
base.Paint(g, bounds, source, rowNum, this.backBrush, foreBrush, alignToRight);
}
}
class MyForm: Form
{
public MyForm
{
const string TABLE_NAME = "demo_table";
const string COL_ID_NAME = "id";
const string COL_NAME_NAME = "name";
//Создаем DataTable и ее столбцы
DataTable dataTable = new DataTable(TABLE_NAME);
dataTable.Columns.AddRange(new DataColumn[]{
new DataColumn(COL_ID_NAME, typeof(int
new DataColumn(COL_NAME_NAME, typeof(string});
//Заполняем DataTable 3-мя строками
dataTable.Rows.Add(new object[]{0, "zero"});
dataTable.Rows.Add(new object[]{1, "one"});
dataTable.Rows.Add(new object[]{2, "two"});
//Создаем стиль для столбца COL_ID_NAME
MyTextBoxStyle styleID = new MyTextBoxStyle;
styleID.MappingName = COL_ID_NAME;
styleID.BackColor = Color.Green;
//Создаем стиль для столбца COL_NAME_NAME
MyTextBoxStyle styleName = new MyTextBoxStyle;
styleName.MappingName = COL_NAME_NAME;
styleName.BackColor = Color.Red;
//Создаем стиль таблицы и заполняем его стилями столбцов
DataGridTableStyle tableStyle = new DataGridTableStyle;
tableStyle.MappingName = TABLE_NAME;
tableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[]{styleID, styleName});
//Создание и инициализация DataGrid'a
DataGrid dataGrid = new DataGrid;
dataGrid.Dock
А ещё занеси в букмарки ссылку Вопрос
Как раскрасить ячейки в DataGrid'e?
Ответ
Такая возможность будет доступна, если создать свой стиль столбца (производный, например, от DataGridTextBoxColumn) и в нем переопределить метод Paint. Каждый раз при вызове Paint будем генерировать событие, на которое должен подписаться "клиент", отвечающий за указание цвета заливки конкретной ячейки и после этого вызываем Paint базового класса.class ColoredTextBoxColumn: DataGridTextBoxColumn
{
//Определим класс аргумента события, делегат и само событие,
//необходимые для "общения" кода выполняющего прорисовку ячейки, с кодом,
//предоставляющим цвет для этой ячейки.
public class NeedBackgroundEventArgs: EventArgs
{
int rowNum;
public int RowNum
{
get
{
return rowNum;
}
}
public NeedBackgroundEventArgs(int rowNum, Brush brush)
{
this.rowNum = rowNum;
this.brush = brush;
}
Brush brush;
public Brush Brush
{
get
{
return brush;
}
set
{
brush = value;
}
}
}
public delegate void NeedBackgroundEventHandler(object sender,
NeedBackgroundEventArgs e);
public event NeedBackgroundEventHandler NeedBackground;
//А вот и переопределенный метод DataGridTextBoxColumn.Paint
//запрашивающий при помощи события (аргументов) цвет и передающий его
//базовому методу Paint в параметре backBrush.
//Теперь метод Paint базового класса будет заниматься прорисовкой ячейки,
//используя при этом подставленный нами backBrush.
protected override void Paint(Graphics g,
Rectangle bounds, CurrencyManager source,
int rowNum, Brush backBrush, Brush foreBrush,
bool alignToRight)
{
NeedBackgroundEventArgs e = new NeedBackgroundEventArgs(rowNum,
new SolidBrush(Color.White;
if (NeedBackground != null)
NeedBackground(this, e);
base.Paint(g, bounds, source, rowNum,
e.Brush, foreBrush, alignToRight);
}
}
Вот пример, использующий вновь созданный стиль столбца, здесь в DataGrid'e отображается столбец с названиями нескольких цветов, причем фон у ячеек, соответствует цвету:class ColoredGrid: Form
{
const string TABLE_NAME = "colors";
const string COLOR_NAME_COLUMN = "colorName";
enum SampleColors{Red, Green, Blue, Yellow, Orange, Brown};
DataTable dataTable;
DataGrid dataGrid;
static void Main
{
Application.Run(new ColoredGrid;
}
public ColoredGrid
{
FillDataTable;
dataGrid = new DataGrid;
dataTable.DefaultView.AllowEdit = false;
dataTable.DefaultView.AllowNew = false;
dataGrid.DataSource = dataTable;
dataGrid.Dock = DockStyle.Fill;
dataGrid.TableStyles.Add(GetTableStyle;
dataGrid.Parent = this;
}
//Создает и заполняет DataTable, в качестве столбца выступает имя цвета
void FillDataTable
{
dataTable = new DataTable(TABLE_NAME);
dataTable.Columns.Add(COLOR_NAME_COLUMN, typeof(string;
foreach(string colorName in Enum.GetNames(typeof(SampleColors
{
DataRow newRow = dataTable.NewRow;
newRow[COLOR_NAME_COLUMN] = colorName;
dataTable.Rows.Add(newRow);
}
}
//Создает и возвращает DataGridTableStyle
DataGridTableStyle GetTableStyle
{
ColoredTextBoxColumn coloredColumn = new ColoredTextBoxColumn;
coloredColumn.MappingName = COLOR_NAME_COLUMN;
coloredColumn.HeaderText = "Цвет";
coloredColumn.NeedBackground += new
ColoredTextBoxColumn.NeedBackgroundEventHandler(OnNeedBackround);
DataGridTableStyle tableStyle = new DataGridTableStyle;
tableStyle.MappingName = TABLE_NAME;
tableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[]
{coloredColumn});
return tableStyle;
}
//Обработчик события на запрос background'a
void OnNeedBackround(object sender,
ColoredTextBoxColumn.NeedBackgroundEventArgs e)
{
string colorName = (string)dataGrid[e.RowNum, 0];
e.Brush = new SolidBrush(Color.FromName(colorName;
}
}
Можно заметить, что при такой раскраске, когда фокус ввода помещен в какую-либо ячейку, background ячеки изменяется на цвет SystemColor.Window, вот что можно сделать чтобы избежать этого:
Та редактируемая ячейка в DataGrid'e - это единственный экземпляр TextBox'a (для каждого столбца свой который при выборе другой ячейки позиционируется на соответствующие координаты, поэтому нужно управлять background'ом именно этого TextBox'a. Чтобы было проще получить нужный TextBox (при наличии нескольких столбцов в DataGrid'e) опять-же можно воспользоваться классом, наследующим DataGridTextBoxColumn, у которого есть соответствующее свойство - TextBox, для которого и нужно проставлять соответствующий BackColor. Ниже пример, который это демонстрирует, в нем основной интерес представляет класс MyTextBoxStyle, все остальное - лишь для заполнения и создания DataGrid'a: using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data;
class MyTextBoxStyle: DataGridTextBoxColumn
{
public MyTextBoxStyle
{
backBrush = new SolidBrush(TextBox.BackColor);
}
Brush backBrush;
//Свойство, позволяющее получить доступ к цвету Background'a
public Color BackColor
{
get
{
return TextBox.BackColor;
}
set
{
backBrush = new SolidBrush(value);
TextBox.BackColor = value;
}
}
//Переопределяем Paint для вывода нужного background'a
protected override void Paint(Graphics g, Rectangle bounds, CurrencyManager source,
int rowNum, Brush backBrush, Brush foreBrush, bool alignToRight)
{
base.Paint(g, bounds, source, rowNum, this.backBrush, foreBrush, alignToRight);
}
}
class MyForm: Form
{
public MyForm
{
const string TABLE_NAME = "demo_table";
const string COL_ID_NAME = "id";
const string COL_NAME_NAME = "name";
//Создаем DataTable и ее столбцы
DataTable dataTable = new DataTable(TABLE_NAME);
dataTable.Columns.AddRange(new DataColumn[]{
new DataColumn(COL_ID_NAME, typeof(int
new DataColumn(COL_NAME_NAME, typeof(string});
//Заполняем DataTable 3-мя строками
dataTable.Rows.Add(new object[]{0, "zero"});
dataTable.Rows.Add(new object[]{1, "one"});
dataTable.Rows.Add(new object[]{2, "two"});
//Создаем стиль для столбца COL_ID_NAME
MyTextBoxStyle styleID = new MyTextBoxStyle;
styleID.MappingName = COL_ID_NAME;
styleID.BackColor = Color.Green;
//Создаем стиль для столбца COL_NAME_NAME
MyTextBoxStyle styleName = new MyTextBoxStyle;
styleName.MappingName = COL_NAME_NAME;
styleName.BackColor = Color.Red;
//Создаем стиль таблицы и заполняем его стилями столбцов
DataGridTableStyle tableStyle = new DataGridTableStyle;
tableStyle.MappingName = TABLE_NAME;
tableStyle.GridColumnStyles.AddRange(new DataGridColumnStyle[]{styleID, styleName});
//Создание и инициализация DataGrid'a
DataGrid dataGrid = new DataGrid;
dataGrid.Dock
Оставить комментарий
rail79
Датасурс содержит 2 колонки.Ячейки второй колонки содержат значение true или false.
Как сделать так, чтобы текст ячеек первой колонки в определенной строке имел тот или иной цвет в зависимости от значения ячейки второй колонки в этой же строке?