В дополнение к этот вопрос Я пытаюсь реализовать DataTable для использования в качестве источника данных для DataGridView. Исходная проблема, которую я пытаюсь обойти, состоит в том, что DGV представляет небольшое подмножество чисел из значительной иерархии объектов и должно отражать изменения, внесенные в эти объекты. Я не могу просто привязать DGV к исходным данным. Поэтому я создал промежуточную таблицу DataTable, заполнил ее данными для отображения в пользовательском интерфейсе, а затем связал их с DGV.
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что, хотя все динамики c значения имеют числовое значение c, я не могу установить формат отображения для этих ячеек, используя свойство Format объекта DataGridViewCellStyle. Если я попытаюсь установить число в три знака после запятой, используя, например, "###### 0.000", они не изменятся. Это не особенно удивляет меня, так как тип данных DataTable - «объект». Я установил это намеренно по двум причинам: 1) он должен содержать ссылки на базовые данные, а не значения, и 2) содержимое представляет собой смесь текста, который остается фиксированным, и чисел, которые будут меняться. Поэтому я думаю, что DGV не рассматривает значения как цифры c.
Привязка выполняется следующим образом:
private void Test_Click(object sender, EventArgs e)
{
DataTable dt = populateDataTable();
BindingSource SBind = new BindingSource();
SBind.DataSource = dt;
dataGridView1.DataSource = SBind;
FormatDGV(dataGridView1);
}
DataTable заполняется следующим образом:
private DataTable populateDataTable(int cols, int rows)
{
DataTable custTable = new DataTable("UITable");
for (int i = 0; i < cols; i++)
{
custTable.Columns.Add("", typeof(object));
}
for (int j = 0; j < rows; j++)
{
custTable.Rows.Add(new object[cols]);
}
... затем добавьте указанную c информацию, которая должна отображаться в пользовательском интерфейсе. Текст добавляется как объект:
custTable.Rows[1][0] = (object)"foo";
custTable.Rows[4][0] = (object)"bar";
Затем я пытаюсь установить стили для ячеек, как я делал ранее (предварительная привязка):
dgv[2 + i, 10].Style = greenText;
DataGridViewCellStyle greenText = NewNumberFont(Color.Green, "######0.000");
private DataGridViewCellStyle NewNumberFont(Color fontColor, string numberFormat)
{
DataGridViewCellStyle numberFont = new DataGridViewCellStyle(dataGridView1.DefaultCellStyle);
numberFont.Alignment = DataGridViewContentAlignment.MiddleRight;
Font newFont = new Font(dataGridView1.Font.Name, 15, FontStyle.Regular);
numberFont.Font = newFont;
numberFont.ForeColor = fontColor;
numberFont.Format = numberFormat;
return numberFont;
}
Можно ли использовать этот подход для промежуточного источника данных, содержащего смесь текста и чисел, и при этом сохранять контроль над форматом чисел, отображаемым в DataGridView?