Вы должны привести выбранную строку как элемент того же типа, что и ваш класс данных.
Пример:
Удалить сетку данных на форме.назовите его «grdMyData», нажмите кнопку в форме, назовите его «btnGetData»
Создайте класс в вашем приложении для хранения ваших данных, в моем случае:
public class channel
{
public int id { get; set; }
public string channelName { get; set; }
}
Создайте себясписок тестовых данных (обратите внимание, что это может быть так же легко получено из модели сущностей, я просто использую это для иллюстрации.)
public List<channel> testData = new List<channel>
{
new channel {id = 1, channelName = "BBC1"},
new channel {id = 2, channelName = "BBC2"},
new channel {id = 3, channelName = "ITV1"},
new channel {id = 4, channelName = "Channel 4"},
new channel {id = 5, channelName = "Channel 5"}
};
В обработчике щелчков вашей кнопки свяжите свои данные с вашей сеткой...
grdMyData.AutoGenerateColumns = true;
grdMyData.ItemsSource = testData;
В вашей сетке событие SelectionChanged добавьте следующее:
if (grdMyData.SelectedIndex != -1)
{
channel selecteditem = (channel) grdMyData.Items[grdMyData.SelectedIndex];
MessageBox.Show(selecteditem.channelName);
}
Вы используете SelectedIndex, чтобы найти строку, по которой щелкнули, и использовать ее в качестве индексав массив предметов.Затем вы приводите этот элемент в качестве объекта вашего класса и обращаетесь к свойствам как обычно.
Проверка -1 необходима, чтобы она не срабатывала при рисовании / заполнении сетки, если нет реальных строкпри щелчке по индексу всегда будет -1.
ОБНОВЛЕНИЕ
Похоже, что ОП немного запутался в том, как здесь используются объекты, поэтому, основываясь на комментариях, я собираюсьпопытаться немного прояснить ситуацию:
Где я использую "канал" выше, это то, что я назвал своим объектом, который содержит данные, которыми я заполняю сетку, для других целей это будет объектНапример, если вы показываете список пользователей, у вас может быть «пользовательский» объект, подобный следующему:
public class user
{
public string firstName { get; set; }
public string lastName { get; set; }
public int age { get; set; }
}
Если вы хотите получить ряд данных из вашей сетки данныхвместо:
channel selecteditem = (channel) grdMyData.Items[grdMyData.SelectedIndex];
вы бы использовали:
user selecteditem = (user) grdMyData.Items[grdMyData.SelectedIndex];
заполнение сетки в первую очередь будет аналогичным, но вместо списка каналов, созданного статически в качестве моего примерапоказывает (который был только для дв целях эмо) вы можете получить это из базы данных:
var myUsers = from p in mydb.userstable
select p;
grdMyData.ItemSource = myUssers;
Важно помнить, что все, что вы помещаете в сетку данных, имеет прямое сопоставление «один к одному» со строкой, которую вы извлекаете, когдаиспользуя выбранные данные.
В действительности, вместо того, чтобы извлекать данные непосредственно из вашей базы данных, как я только что сделал, у вас может быть больше шансов перебрать эту коллекцию и поместить пользовательские объекты в вашу собственную коллекцию объектов, потому что еслиесли вы все создаете автоматически, то у вас есть шанс не знать расположение объекта, и даже могут быть другие элементы, которые вы не хотите отображать.тогда я могу предположить, что ваша сетка отфильтровывает только те из вашей базы данных, поэтому лучше создать класс для моделирования только этих элементов, затем заполнить список этих классов и передать этот список в сетку данных.
Затем используйте свой собственный класс вместо канала / пользователя / чего-либо в примереes выше.