Получить данные из сетки данных C # Entity Framework WPF - PullRequest
0 голосов
/ 07 сентября 2011

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

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

Например: когда пользователь выбирает строку, я хотел бы иметь возможность получить данные отдельной ячейки и использовать их в своем запросе LINQ.

Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

Спасибо

1 Ответ

0 голосов
/ 07 сентября 2011

Вы должны привести выбранную строку как элемент того же типа, что и ваш класс данных.

Пример:

Удалить сетку данных на форме.назовите его «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 выше.

...