Используется ли datagridview_CellFormating для форматирования отображения ячеек в dataGridView? - PullRequest
0 голосов
/ 23 марта 2019

Я делаю приложение для управления студентами. Он загружает данные от SQL server до DataGridView. В моей таблице есть поле Boolean, которое называется Пол . Когда таблица загружается в DataGridView, столбец Gender отображается только под флажками type. Я хочу изменить его представительный способ на другой вместо вместо флажков , как это. (Строка показывает « Мужской » или « Женский »).

Appication Captured

Я пробовал многие решения, которые ищутся в Google. Но я не могу найти решение своей проблемы.

SQL создать код таблицы:

create table Student
(
    CodeSV varchar(5) not null primary key,
    FirstnameSV varchar(20) not null, 
    LastnameSV varchar(30) not null, 
    BirthDate date,
    Gender bit not null,
)

Свойства объекта:

public int CodeSV{ get; set; }
public string FirstnameSV { get; set; }
public string LastnameSV { get; set; }
public DateTime BirthDate { get; set; }
public bool Gender { get; set; }

Я использовал этот код для отображения данных в DataGridView:

List<Object> list = new List<Object>();
BindingSource bs = new BindingSource();
list = ObjectDAO.ListAllStudent();
if (list != null)
{
    bs.DataSource = list;
    dgvManager.DataSource = bs;
    dgvManager.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
}

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Вероятно, вы ищете событие dataGridView_CellPainting.

Здесь вы можете нарисовать строку с требуемым содержимым и использовать различные встроенные вспомогательные функции для рисования других вещей, которые должна отображать ячейка..

Когда закончите, установите e.Handled = true;, чтобы предотвратить перерисовку ваших вещей при обычной рисовании.

Пример, который отображает флажки слева и текст справа:

enter image description here

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if ( e.RowIndex >= 0 && e.ColumnIndex == 0)
    {
        Brush br = e.State.HasFlag(DataGridViewElementStates.Selected) ?
            SystemBrushes.HighlightText : SystemBrushes.WindowText;
        Font font = dataGridView1.DefaultCellStyle.Font;
        Rectangle r2 = new Rectangle(e.CellBounds.X + 24, e.CellBounds.Y, 
            e.CellBounds.Width - 24, e.CellBounds.Height);

        e.PaintBackground(e.CellBounds, true);

        using (StringFormat fmt = new StringFormat()
        { LineAlignment = StringAlignment.Center})
           if (e.Value != null) e.Graphics.DrawString(e.Value.ToString(), font, br, r2, fmt);

        e.PaintContent(e.CellBounds);
        e.Handled = true;
    }
}

Я ленивый и использую магическое число (24) для смещения, но есть способы определить лучшее значение более гибким способом,если нужно ..

Ячейка выравнивается следующим образом:

dataGridViewCellStyle1.Alignment = DataGridViewContentAlignment.MiddleLeft;

Поскольку флажки DGV не будут верить в их изменения, пока пользователь не покинет ячейку, нам нужно, чтобы это работало должным образом:

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
}

Примечание. Здесь значения ToString имеют значения True и False.Если вы установите флажок, чтобы разрешить третье состояние (ThreeState = true) будет Checked, Unchecked и Indeterminate.Затем вам нужно проверить их и отобразить нужную вам строку.

Как отмечалось в моем комментарии, вы на самом деле должны разрешить хотя бы одному альтернативному полу и неопределенное состояние;так что CheckBox не самый лучший вариант.Не забудьте использовать раскрывающийся список!

1 голос
/ 23 марта 2019

Поскольку вы используете Class для этого, я рекомендую вам изменить его, чтобы сделать так, как вы описываете. При использовании List<T> в качестве DataSource для сетки, общедоступные (не собранные) свойства класса будут сопоставлены со столбцами в сетке. В этом случае поле Gender является логическим и будет отображаться как флажок.

Чтобы это значение отображалось в виде строкового значения (мужской / женский) ... тогда я предлагаю вам создать это "свойство" в Student классе .... Что-то вроде ниже ...

public string GenderString {
  get {
    if (Gender) {
      return "Male";
    }
    return "Female";
  }
}

Это «добавит» столбец GenderString в сетку. Если вы не хотите, чтобы столбец Gender «Boolean» отображался, вы можете либо сделать его невидимым в сетке, либо задать свойство Gender private.. Имейте в виду, если вы делаете свойство Gender Propert private, вам нужно будет сделать публичный метод «set» для установки его значения;

Надеюсь, это поможет.

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