Создание строки пользовательского формата в dataGridView

У меня есть dataGridView, источником данных которого является dataTable.

Моя проблема в том, что я хочу, чтобы определенные столбцы отображались в шестнадцатеричном формате. Я могу зайти так далеко, используя что-то вроде этого:

 foreach (DataGridViewColumn c in grid.Columns)
        {
            if (DISPLAYED_IN_HEX.Contains(c.Name))
            {
                c.DefaultCellStyle.Format = "X";

            }
        }

Однако моя проблема заключается в том, что я хочу, чтобы это шестнадцатеричное значение начиналось с 0x, чтобы никого не смущать, что они в шестнадцатеричной форме. Значения в dataTable представляют собой различные целочисленные типы. Я изучил возможность создания пользовательского IFormatProvider, но не думаю, что мои навыки программирования пока соответствуют этому уровню. Любые другие возможные решения?


person Andy    schedule 26.04.2010    source источник


Ответы (2)


Да, событие CellFormatting подойдет. Вот пример: он пытается преобразовать десятичное число в первом столбце в шестнадцатеричное:

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) {
        if (e.ColumnIndex == 0 && e.Value != null) {
            long value = 0;
            if (long.TryParse(e.Value.ToString(), out value)) {
                e.Value = "0x" + value.ToString("X");
                e.FormattingApplied = true;
            }
        }
    }
person Hans Passant    schedule 26.04.2010
comment
Спасибо, хотя greggorob64 прямо сказал, я забыл строку e.FormattingApplied = true; - person Andy; 26.04.2010

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

person Hans Olsson    schedule 26.04.2010
comment
Внутри события CellFormatting вы можете захватить столбец, который хотите отформатировать, с помощью EventArgs. Изменив свойство e.Value любой строкой, которую вы хотите, вы сможете переформатировать строку по мере необходимости. Если вы вносите какие-либо изменения, убедитесь, что для e.FormatApplied установлено значение true. - person greggorob64; 26.04.2010
comment
проблема в том, что тип данных не является строкой, поэтому я не могу просто изменить его значение, чтобы перед ним было 0x. - person Andy; 26.04.2010
comment
Вы можете изменить его на строку, а затем добавить 0x впереди, и вы можете сохранить исходное значение в свойстве тега ячеек. По крайней мере, если это просто для представления информации, если вам нужно записать ее обратно в DataTable, я не уверен. - person Hans Olsson; 26.04.2010
comment
У меня нет доступа ни к чему о типе данных с DataGridViewCellFormattingEventArgs. Я могу установить e.value в строку, которую хочу, но кажется, что dataTable обновляется автоматически, и именно здесь возникает исключение о string-›int. - person Andy; 26.04.2010
comment
Странно, я только что проверил, и у меня есть сетка данных, которая заполняется из DataTable, и я без проблем форматирую поля double и DateTime в строки (если только он не конвертирует их обратно, но я добавляю знак валюты к двойному) . Все, что я делаю, это что-то похожее на e.Value = FormatAsMyString(e.Value);. - person Hans Olsson; 26.04.2010