Я хочу отобразить выбранную строку из сетки данных в текстовые поля, поэтому я получил это видео: https://www.youtube.com/watch?time_continue=127&v=SDUt4y-H-nw. Я следовал этому шаг за шагом, но когда я тестировал его, он не работал (он не отображал данные из сетки данных в текстовые поля). Это мой код:
private void DGBookings_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid dg = (DataGrid)sender;
DataRowView row_selected = dg.SelectedItem as DataRowView;
if (row_selected != null)
{
textBoxKlant.Text = row_selected["Naam"].ToString();
dpIncheck.Text = row_selected["Incheckdatum"].ToString();
dpUitcheck.Text = row_selected["Uitcheckdatum"].ToString();
dpHotelLocatie.Text = row_selected["Hotel"].ToString();
dpAantalPersonen.Text = row_selected["Aantal_personen"].ToString();
dpMedewerker.Text = row_selected["medewerkerid"].ToString();
}
}
Я предполагаю, что это потому, что я использую пакет materialdesign... Может ли это быть правдой? Или это мой код? Если это мой код, не стесняйтесь давать предложения.
@dotNET это так DGBookings.ItemsSource = bookings;
Да, я думал, что это будет так. Смотрите мой ответ.
Ваш DataGrid
привязан к источнику данных. Если это так, следующая строка вызовет проблемы:
DataRowView row_selected = dg.SelectedItem as DataRowView;
Для связанных элементов управления SelectedItem
относится к типу базового элемента коллекции, а не DataRowView
. Таким образом, приведенная выше строка установит raw_selected
в null
, и следующий блок кода не будет выполняться. Вместо этого вы должны привести его к этому типу, а затем заполнить текстовые поля напрямую, используя свойства этого элемента.
Мое предложение для вас, чтобы узнать о MVVM. Уровень вашей виртуальной машины должен предоставлять свойство типа коллекции для привязки ItemSource
к нему и другое свойство для привязки SelectedItem
. Затем вы сможете использовать это второе свойство для привязки ваших текстовых полей. Нет необходимости использовать событие SelectionChanged
. На самом деле в файле кода программной части Windows не будет абсолютно никакого пользовательского кода.
Если вы хотите придерживаться подхода обработки событий, все, что вам нужно сделать, это заменить приведенную выше строку на эту:
var row_selected = dg.SelectedItem as Booking;
Я предполагаю, что тип данных ваших элементов в коллекции bookings
— Booking
. Если это что-то другое, используйте это имя типа.
Можете ли вы привести пример с кодом, который я вам дал? Или вам нужно больше? Когда вы сможете это сделать, я отмечу ваш ответ;)
Так это невозможно с Itemsource
?
@portalstudent: я ничего не знаю о коллекции bookings
. Что это за тип? Каков тип его предметов? Если вы хотите придерживаться подхода обработки событий, все, что вам нужно изменить в своем коде, — это слово DataRowView
в строке выше и заменить его типом ваших элементов.
Изменив его на эту строку, он все равно не работает :(
Чем у меня есть эта ошибка: Cannot apply indexing with [] to an expression of type 'Booking'
в этих строках: textBoxKlant.Text = row_selected["Naam"] .ToString();
> row_selected["Naam"]
Бронирование — это список.
Если вам нужна дополнительная справочная информация, не стесняйтесь спрашивать.
Ваш
DataGrid
привязан к источнику данных?