Создать таблицу DataGridView без источника?

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

Класс выглядит следующим образом...

public class Ticket
{
    public string ID { get; set; }
    public string TicketID { get; set; }
    public string DeptID { get; set; }
    public string UserID { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string CC { get; set; }
    public string Subject { get; set; }
    public string Message { get; set; }
    public string Status { get; set; }
    public string Priority { get; set; }
    public DateTime Date { get; set; }
    public DateTime LastResponse { get; set; }
    public IPAddress IP { get; set; }
}

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

Вот мой тестовый код, реализующий предложенное ниже предложение, но я получаю "Невозможно добавить строку в элемент управления DataGridView, в котором нет столбцов".

                WHMCS x = new WHMCS();
                List<WHMCS.Ticket> Tickets = new List<WHMCS.Ticket>();
                Tickets = x.Get_Tickets();

                KryptonDataGridView dgv = new KryptonDataGridView();
                content1.Controls.Add(dgv);

                foreach (var tix in Tickets)
                {
                    var objArr = new object[] {tix.Priority, tix.Subject};
                    dgv.Rows.Add(objArr);
                }

2 ответа

Решение

Вы можете добавить строки вручную, преобразовав свой класс Ticket в массив объектов, используя интересующие вас поля, а затем добавив массив в dataGrid. Что-то вроде

foreach(var ticket in AllTickets){
    var objArr = new object[]{ticket.Id, ticket.DeptId...};
    dataGrid.Rows.Add(objArr);
}

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

В ответ на ваш комментарий: Перед добавлением строк заполните dataGrid столбцами:

_colId = new DataGridViewTextBoxColumn
        {
           Name = "Id",
           HeaderText = Id.CreationDate,
           AutoSizeMode = DataGridViewAutoSizeColumnMode.None,
           Width = 150,
           ReadOnly = true,
        };
//...

dataGrid.Columns.Add(_colId);
dataGrid.Columns.Add( other columns... );

Используйте любые свойства, которые вам нужны в каждом столбце.

Если вы не используете источник данных, я считаю, что вы должны явно добавить столбцы в первую очередь. Как вы знаете столбцы, которые вы хотите показывать, перед тем, как использовать цикл foreach:

dgv.Columns.Add([Column Info]); 

Этот метод позволит вам явно создавать столбцы, к которым вы будете добавлять информацию при добавлении строки.

Другие вопросы по тегам