Однако то, что вы пытаетесь сделать, выполнимо;Я предполагаю, что вам, возможно, придется подходить к этому по-другому.
Глядя на картинку, в частности, столбец «Данные А»… это столбец флажка.Каждая ячейка флажка в этом столбце является данными, привязанными к объекту Origin
.Этот Origin
объект имеет два (2) свойства bool: IsAllowed
и IsGloballyAllowed.
Сетка не будет знать, какой из них отображать, даже если они открыты для общественности.Кроме того, «логика», которую вы описали ...
(IsAllowed = TRUE and IsGloballyAllowed = TRUE) THEN CheckBox is Checked
(IsAllowed = TRUE and IsGloballyAllowed = FALSE) THEN CheckBox is Indeterminate
(IsAllowed = FALSE and IsGloballyAllowed = FALSE) THEN CheckBox is Unchecked
отсутствует в классе Origin
.Дело в том, что ячейки флажка могут принимать только ОДНО (1) значение, и предлагается два (2).Приведенная выше логика - это то, что вам нужно реализовать, чтобы вернуть желаемое состояние проверки.Класс Origin
, представленный ниже, демонстрирует один из способов достижения этого.
class Origin {
public bool IsAllowed { get; set; }
public bool IsGloballyAllowed { get; set; }
public Origin(bool isAllowed, bool isGloballyAllowed) {
IsAllowed = isAllowed;
IsGloballyAllowed = isGloballyAllowed;
}
public bool? CheckState {
get {
if (IsAllowed && IsGloballyAllowed)
return true;
if (!IsAllowed && !IsGloballyAllowed)
return false;
//if (IsAllowed == true && IsGloballyAllowed == false)
// return null;
return null;
}
}
}
Добавлен метод получения / свойства CheckState
, который возвращает обнуляемое значение bool: true
, false
или null
Это свойство, которое класс OriginSet
может использовать для «выставления»”От CheckedState
до DatagridView
и установите флажки правильно.Поэтому в классе OriginSet
необходимо внести некоторые изменения.
В классе OriginSet
уже известно, что «экспонирование» объекта Origin
в ячейку не будет работать.Следовательно, одно из возможных решений - создать действительные переменные bool?
, которые «будут работать» при установке флажка в сетках.После добавления в класс и инициализации в конструкторе с использованием каждого свойства Origin
objects CheckState
мы можем использовать переменные для правильной установки флажков.
class OriginSet {
public string OriginType { get; set; }
public Origin OriginData_A { get; set; }
public Origin OriginData_B { get; set; }
public Origin OriginData_C { get; set; }
public bool? originA_State { get; set; }
public bool? originB_State { get; set; }
public bool? originC_State { get; set; }
public OriginSet(string originType, Origin originDataA, Origin originDataB, Origin originDataC) {
OriginType = originType;
OriginData_A = originDataA;
OriginData_B = originDataB;
OriginData_C = originDataC;
originA_State = originDataA.CheckState;
originB_State = originDataB.CheckState;
originC_State = originDataC.CheckState;
}
}
С этими изменениями все, что необходимоправильно установить столбцы DataGridview
.Немного здесь, но важно отметить, что при добавлении столбца в сетку его DataPropertyName
должен совпадать с именем свойства в классе OriginSet
в дополнение к установке ThreeState
в значение true, чтобы включить значение null
,Наконец, установите для AutoGenerateColumns
значение false, чтобы сетка не пыталась отобразить все «публичные / открытые» свойства в классе OriginSet
.
List<OriginSet> originList;
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
FillList();
SetGridProperties();
dataGridView1.DataSource = originList;
}
private void FillList() {
originList = new List<OriginSet> {
new OriginSet("Origin 0", new Origin(true, true), new Origin(true, true), new Origin(true, true)),
new OriginSet("Origin 1", new Origin(true, false), new Origin(true, false), new Origin(true, false)),
new OriginSet("Origin 2", new Origin(false, false), new Origin(false, false), new Origin(false, false))
};
}
private void SetGridProperties() {
DataGridViewTextBoxColumn txtCol = new DataGridViewTextBoxColumn();
txtCol.HeaderText = "Origin";
txtCol.DataPropertyName = "OriginType";
dataGridView1.Columns.Add(txtCol);
dataGridView1.Columns.Add(GetCheckBoxCol("Data A", "originA_State"));
dataGridView1.Columns.Add(GetCheckBoxCol("Data B", "originB_State"));
dataGridView1.Columns.Add(GetCheckBoxCol("Data C", "originC_State"));
dataGridView1.AutoGenerateColumns = false;
}
private DataGridViewCheckBoxColumn GetCheckBoxCol(string name, string dataname) {
DataGridViewCheckBoxColumn chckCol = new DataGridViewCheckBoxColumn();
chckCol.Name = name;
chckCol.DataPropertyName = dataname;
chckCol.ThreeState = true;
return chckCol;
}
Должно начать становиться ясно, что может бытьпроблема здесь.Эта проблема будет в том, что вы планируете делать, если пользователь «меняет» флажок?Эти флажки были определены начальными значениями isAllowed
и isGloballyAllowed
... Дело в том, что начальная «логика» для «установки» CheckState
станет «сломанной», когда пользователь «поменяет» одну из провероккоробки.Если вы хотите, чтобы эта логика была правильной, что, как я полагаю, вы бы сделали, вам придется проделать еще некоторую работу для поддержания этой «логики».
Надеюсь, что это имеет смысл и помогает.