Числовое c форматирование ссылочного свойства в DataGridView, привязанном к DataTable - PullRequest
0 голосов
/ 05 января 2020

В дополнение к этот вопрос Я пытаюсь реализовать 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?

1 Ответ

0 голосов
/ 05 января 2020

Вы можете просто использовать событие CellFormatting, а затем проверить значение ячейки, если оно численно применяется к формату

public Form1()
    {
        InitializeComponent();
        this.dataGridView1.CellFormatting += DataGridView1_CellFormatting;
        this.dataGridView1.Rows.Add("five");
        this.dataGridView1.Rows.Add("235656.5477");
        this.dataGridView1.Rows.Add("24.54"); 
    }
private void DataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (Microsoft.VisualBasic.Information.IsNumeric(e.Value))
    {
        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 = Color.Red;
        numberFont.Format = "{0:#,0.####}";
        e.CellStyle = numberFont;
        e.Value = string.Format("{0:#,0.####}", Decimal.Parse(e.Value.ToString()));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...