Установить значение ячейки DataGridView из значения подкласса - PullRequest
0 голосов
/ 07 июня 2018

при условии, что у меня есть класс, как показано ниже:

public class Origin {
    public Origin(bool isAllowed, bool isGloballyAllowed) {
        IsAllowed = isAllowed;
        IsGloballyAllowed = isGloballyAllowed;
    }

    public bool IsAllowed { get; set; }
    public bool IsGloballyAllowed { get; set; }
}

public class OriginSet {
    public OriginSet() {
        OriginType = originType;
        OriginData_A = originDataA;
        OriginData_B = originDataB;
        OriginData_C = originDataC;
    }

    public string OriginType { get; set; }
    public Origin OriginData_A { get; set; }
    public Origin OriginData_B { get; set; }
    public Origin OriginData_C { get; set; }
}

, и у меня есть переменная List<OriginSet> со следующими значениями:

var originList = new List<OriginSet> {
    new OriginSet("Origin 1", new Origin(true, true), new Origin(true, false), new Origin(false, false),
    new OriginSet("Origin 2", new Origin(false, false), new Origin(true, false), new Origin(true, true)
};

Как я могу отобразить его в DataGridViewсо схемой ниже:

enter image description here

Идея состоит в том, что у CheckBox в DataGridView включено свойство ThreeState, так что оно доступно в 3 различных значенияхтогда как он зависит от значения класса Origin, который является свойством класса OriginSet, как показано ниже:

(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

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

1 Ответ

0 голосов
/ 08 июня 2018

Однако то, что вы пытаетесь сделать, выполнимо;Я предполагаю, что вам, возможно, придется подходить к этому по-другому.

Глядя на картинку, в частности, столбец «Данные А»… это столбец флажка.Каждая ячейка флажка в этом столбце является данными, привязанными к объекту 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 станет «сломанной», когда пользователь «поменяет» одну из провероккоробки.Если вы хотите, чтобы эта логика была правильной, что, как я полагаю, вы бы сделали, вам придется проделать еще некоторую работу для поддержания этой «логики».

Надеюсь, что это имеет смысл и помогает.

...