Показать столбец CheckBox для Nullable <bool>свойств в DataGridView - PullRequest
1 голос
/ 05 ноября 2019

После долгих поисков мне не удалось найти решение этой проблемы. Я успешно установил DataSource для DatagridView, используя список следующим образом.

Класс

public class ChannelInfo
{
    [Browsable(false)]
    [DisplayName("ChannelId")]
    public int channelId { get; set; }
    [DisplayName("Channel")]
    public string sysName { get; set; }
    [DisplayName("Display Name")]
    public string dispName { get; set; }
    [DisplayName("Unit")]
    public string unit { get; set; }
    [DisplayName("Divide By")]
    public int divideBy { get; set; }
    [DisplayName("YAxis")]
    public string yAxis { get; set; }
    [DisplayName("Min Scale")]
    public int scaleMin { get; set; }
    [DisplayName("Max Scale")]
    public int scaleMax { get; set; }
    [DisplayName("Colour")]
    public string colour { get; set; }
    [DisplayName("Set Point")]
    public double setPoint { get; set; }
    [DisplayName("Limit(+/-)")]
    public double? limit { get; set; }
    [DisplayName("MKT")]
    public bool? IncludeInMKT { get; set; }
    /// <summary>
    /// Default constructor
    /// </summary>
    public ChannelInfo()
    {

    }

    /// <summary>
    /// Copy constructor to create a copy of another object
    /// </summary>
    /// <param name="ci"> and object of the type ChannelInfo whos copy is to be created</param>
    public ChannelInfo(ChannelInfo ci)
    {
        channelId = ci.channelId;
        sysName = ci.sysName;
        dispName = ci.dispName;
        unit = ci.unit;
        divideBy = ci.divideBy;
        yAxis = ci.yAxis;
        scaleMin = ci.scaleMin;
        scaleMax = ci.scaleMax;
        colour = ci.colour;
        setPoint = ci.setPoint;
        limit = ci.limit;
        IncludeInMKT = ci.IncludeInMKT;
    }
}

, устанавливающий источник данных сетки

static List<ChannelInfo> chInfoList;
dgvChannels.DataSource = chInfoList;

Тип последнего столбца сетки данных устанавливается на DataGridViewCheckBoxColumn с помощью конструктора. Сетка данных отображает все данные в порядке, кроме последнего логического поля IncludeInMkt. Он показывает текстовые значения (True / False), тогда как я ожидаю, что он будет отображаться как флажок с соответствующими значениями в chInfoList. Я также установил TrueValue в True, а FalseValue в False в конструкторе.

Куда я иду не так, пожалуйста, предложите.

1 Ответ

0 голосов
/ 05 ноября 2019

DataGridView сгенерирует DataGridViewCheckBoxColumn для bool свойств. Но для bool? свойств он сгенерирует DataGridViewTextBoxColumn.

. Вы можете исправить это во время разработки или во время выполнения, заменив сгенерированный столбец на DataGridViewCheckBoxColumn и установив его ThreeState свойство в true.

Пример - Показать CheckBox для Nullable<bool> в DataGridView

Следующая функция заменяет сгенерированные столбцы для bool? свойств древовидным состояниемстолбцы флажка:

public void UseCheckBoxForNullableBool(DataGridView g)
{
    g.Columns.Cast<DataGridViewColumn>()
        .Where(x => x.ValueType == typeof(bool?))
        .ToList().ForEach(x =>
        {
            var index = x.Index;
            g.Columns.RemoveAt(index);
            var c = new DataGridViewCheckBoxColumn();
            c.ValueType = x.ValueType;
            c.ThreeState = true;
            c.DataPropertyName = x.DataPropertyName;
            c.HeaderText = x.HeaderText;
            c.Name = x.Name;
            g.Columns.Insert(index, c);
        });
}

enter image description here

В приведенной выше форме я использовал следующую модель:

public class Test
{
    public int MyProperty1 { get; set; }
    public bool? MyProperty2 { get; set; }
}

И применил UseCheckBoxForNullableBool, чтобы изменить сгенерированный столбец для свойства bool? на столбец флажка состояния дерева:

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    this.dataGridView1.DataSource = new BindingList<Test>() {
        new Test(){ MyProperty1 = 1, MyProperty2= null},
        new Test(){ MyProperty1 = 2, MyProperty2= true},
        new Test(){ MyProperty1 = 3, MyProperty2= false},
    };
    UseCheckBoxForNullableBool(dataGridView1);
}

Примечание. Если вам интересно показать ComboBox для boolили bool? столбцы, посмотрите на этот пост , который делает то же самое для bool свойств, и измените его немного, чтобы также поддерживать bool?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...