2014-01-06 5 views
1

enter image description hereВозможно ли создать DataGridView, который выглядит так?

Это было разработано с использованием некоторых сторонних компонентов, таких как C1. Как вы можете видеть, здесь есть три вида строк ...

Type 1. L0000000000000000420 - этот вид строки извлекается из базы данных. (Только для чтения)

Type 2. Enter Amount - этот тип строки предназначен для ввода пользователем суммы. (этот может также содержать выпадающий список в некоторых столбцах) (Редактируется только при проверке)

Type 3. WHITE ROW - это просто пустая строка Читайте только для лучшего внешнего вида.

Я хочу знать, возможно ли создать аналогичный, если не совсем тот же вид DataGridView, без использования какого-либо стороннего компонента? Моя идея - забрать строки из базы данных в DataTable, а затем зациклировать их ... Я думаю о добавлении двух дополнительных пустых строк в DataTable после каждой строки, которая была выбрана.

Я также добавить столбец, который будет иметь значение, такое как,

А - (это, чтобы указать тип 1)

В - (это, чтобы указать тип 2)

с - (это, чтобы указать тип 3)

A

Аргументы B

C .. so on

Затем я проверю тип строки в цикле, а затем задаю свойство этой строки для свойств, доступных только для редактирования, и свойств цвета.

Но я не уверен, что это практически возможно. Я не уверен, как я собираюсь добавить ComboBox только для столбца tpe 2. Потому что, если я добавлю столбец ComboBox, он будет отображаться во всех трех строках. Это возможно? Если да, можете ли вы дать мне некоторое представление о том, как это сделать? Мне нужно знать, как я могу это сделать, прежде чем задавать более конкретные вопросы. Спасибо.

+1

** Решение ** Использование WPF. winforms - это действительно старая технология, о которой никто больше не заботится, и которая ничего не поддерживает. Вы можете легко создать что-то подобное в WPF примерно в 30-50 строках XAML, тогда как в winforms потребуются годы ужасных хаков. –

+1

Я боюсь, у меня недостаточно времени для изучения WPF. – Arbaaz

+3

Вы уверены, что можете быстрее создать этот вид в WinForms, чем вы могли бы изучить WPF? – Paparazzi

ответ

2

Я могу согласиться с тем, что WPF лучше/быстрее для такого рода вещей, но это его выбор, использовать его или нет. И изучение WPF с нуля НЕ , что быстро ...

Пока вручную привязать данные к вашему DataGridView вы можете контролировать поведение и внешний вид ваших отдельных клеток, в том числе, конечно, цвета (это самая легкая часть). Я включаю пример для «исчезающих полетов со списком». Последний столбец - простой DataGridViewComboBoxColumn.

enter image description here

private void Form1_Load(object sender, EventArgs e) 
{ 

    dataGridView1.Rows.Add(new[] { "L00000422", "", "","A" }); 
    dataGridView1.Rows.Add(new[] { "Enter Amount", "", "","" }); 
    dataGridView1.Rows.Add(new[] { "", "", "","" }); 
    dataGridView1.Rows.Add(new[] { "L00000423", "", "" ,"B"}); 
    dataGridView1.Rows.Add(new[] { "Enter Amount", "", "", "" }); 
    dataGridView1.Rows.Add(new[] { "", "", "", "" }); 

    foreach (var row in dataGridView1.Rows) 
    { 
     var r = (DataGridViewRow) row; 
     foreach (var col in dataGridView1.Columns) 
     { 
      var cl = (DataGridViewColumn) col; 
      if (cl.Index == 3) 
      { 
       var cc = (DataGridViewComboBoxCell)dataGridView1[3,r.Index]; 
       if (r.Index % 3 != 0) 
       { 
        cc.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing; 
        cc.ReadOnly = true; 
       } 
       else 
       { 
        cc.DisplayStyle = DataGridViewComboBoxDisplayStyle.DropDownButton; 
        cc.ReadOnly = false; 
       } 
      } 
     } 
    } 
} 
+1

+1: bravo за указание, что переход на WPF может быть непрактичным и не обязательно является ответом на каждый вопрос, связанный с пользовательскими интерфейсами. Хотел бы я дать бонус +1 за хороший ответ. – IAbstract

+0

Почему я не могу использовать этот подход для связанного DataGridView? Вы обозначили A, B и C для одного и того же ряда. Я думал, если можно добавить A в те строки, которые были получены из базы данных, B для тех строк, которые я буду добавлять в цикле Enter Amount для ввода. И C для строки пустого разделителя. Я могу установить минимальную ширину. так что он не отображается, но я могу использовать A, B, C в качестве ссылки для форматирования. Является ли это возможным? – Arbaaz

+0

@Arbaaz. Вы можете это сделать, но если вы попытаетесь добавить строки в datagridview databound, вы получите исключение: «Ряды не могут быть программно добавлены в коллекцию строк DataGridView, когда элемент управления связан с данными». Не привязывайте datagridview, запрашивайте данные db, получайте данные, а затем вручную объединяйте свои строки db и ваши настроенные строки, используя цикл, как вы сказали. Это определенно возможно. – Vland

Смежные вопросы