2016-11-12 2 views
0

У меня есть GridControl от Devexpress, и я заполняю элемент управления объектом DataRow. Строка добавляется в сетку, но ячейки пусты. Вот код:DevExpress GridControl mainview не показывает информацию

 DataTable dt = new DataTable(); 
     dt.Columns.Add("Descripcion"); 
     dt.Columns.Add("Cantidad"); 
     dt.Columns.Add("Importe"); 
     gridControl1.DataSource = dt; 

     clsLineaTicket newLn = new clsLineaTicket("Gin Tonic Beefeater", "1", "9,20"); 
     DataRow dr = dt.NewRow(); 
     dr[0] = newLn.strDescripcion; 
     dr[1] = newLn.strCantidad; 
     dr[2] = newLn.strImporte; 
     dt.Rows.Add(dr); 
     gridControl1.DataSource = dt; 

Код довольно прост, любая идея почему не работает? Спасибо.

+1

Любая причина, по которой вы не используете List как DataSource? На мой взгляд, лучше справиться. Еще раз попробуйте установить имена полей ваших GridColumns в имена столбцов. – Sebi

+0

@Sebi Я установил FieldNames, и теперь он отлично работает с DataTable, но я не могу заставить его работать с List . Любая идея заставить его работать? Почему лучше использовать List вместо DataTable? Спасибо! :) – mrvinent

+1

, если вы хотите использовать Список ваших Имена полей, должны соответствовать Именам свойств вашего объекта. Положительным в списке является то, что вы используете свои собственные объекты вместо DataRows. Таким образом, вы получаете доступ к значению через myObj.MyProperty вместо строки ["column"]. Это приносит вам некоторые преимущества в рефакторинге. Дальше это лучше для unittesting и читать легче. С Lambda и Linq вы можете легко фильтровать, сортировать, группировать и т. Д. Список. myList.FindAll (myObj => myObj.City.Contains («Нью-Йорк»), например. – Sebi

ответ

1

Чтобы решить вашу проблему, вы должны установить имена полей ваших GridColumns в имена столбцов вашего DataTable.

Но я бы настоятельно рекомендовал использовать List<clsLineaTicket> вместо того, чтобы преобразовывать это в DataTable.

Сначала у вас уже есть объект, и сетка может справиться с этим довольно хорошо. Поэтому преобразование этого в DataRows представляется ненужным. Не забывайте, что для любого объекта требуется пространство, а DataRow все еще является объектом.

Далее a List<clsLineaTicket> предоставляет вам доступ к объектам вместо доступа DataRow. Это более читаемо и лучше для рефакторинга. Таким образом, вы можете легко переименовать свойство через рефакторинг. Но как переименовать столбец в DataTable? Иногда вы получаете доступ к строке ["ColumnName"]? Затем вы теряетесь, потому что магическая строка не может быть реорганизована. Позвольте мне показать небольшой пример для лучшего readablity из List<T>:

Think вы в случае для двойного щелчка, и вы бы показать цену билета:

//This event is just a dummy and doesn't exists this way 
private void grid_click(object sender, EventArgs e) 
{ 
    //DataTable access 
    var row = gridview.GetFocusedRow() as DataRowView; 
    MessageBox.Show(Convert.ToString(row["Price"]); 

    //List access 
    var lineaTicket = gridView.GetFocusedRow() as LineaTicket; //You directly see it's a ticket here 
    MessageBox.Show(lineaTicket.Price); //You don't need conversion 
} 

Другой Гуди является возможность Lambda и Linq. Вам нужен SubList с alle Tickets, который получил цену ниже 10 $?

List<clsLineaTicket> lowPriceTickets = ticketList.FindAll(ticket=>ticket.Price < 10); 

Если вы используете Список, убедитесь, что ваши имена полей соответствуют Именам свойств. Если вы хотите сделать редактируемую сетку, вам также необходимо реализовать сеттер в своих свойствах.

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

+0

Кажется, что у моего DataSource имеется более одного элемента, но в сетке отображается только первая, любая идея? Извините, что беспокою вас снова – mrvinent

+0

@mrvinent hey no problem. Нет, я думаю, почему это может произойти. Не могли бы вы открыть новый вопрос и опубликовать свой соответствующий Quellcode? Вы можете связать новый вопрос здесь, в комментарии. Тогда я посмотрю. – Sebi

+0

Я любил его Это было просто обновление GridControl.MainView, поэтому с GridControl.MainView.RefreshData() работает. – mrvinent

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