Member 13199484 Ответов: 0

Привязка выбранной строки в datagrid к списку


всем привет,
у меня есть Datagrid, который показывает данные из двух разных таблиц sql, как показано ниже:

<DataGrid x:Name="MyDevicesDataGrid"

SelectionChanged="MyDevicesDataGrid_SelectionChanged" AutoGenerateColumns="False">
<DataGrid.Columns>
  <DataGridTextColumn Binding="{Binding SN}"         Header="SN"/>
  <DataGridTextColumn Binding="{Binding Material}"   Header="Material"/>
  <DataGridTextColumn Binding="{Binding DDOS}"       Header="OS"/>
  <DataGridTextColumn Binding="{Binding DDHW}"       Header="HardWare Version"/>
  <DataGridTextColumn Binding="{Binding DDAvilabil}" Header="Availability"/>
</DataGrid.Columns>
</DataGrid>


первые два столбца принадлежат таблице (а), остальные-таблице (Б).
код привязки, как показано ниже:
var MyDG = (from DD in de.DevicesDets
                          join DT in de.DeviceTs
                          on DD.DDID equals DT.SN
                          where DT.EmpID == ID // ID is string value
                          select new { DT.SN,DT.Material,DD.DDHW,DD.DDAvilabil,DD.DDOS}).ToList();
              MyDevicesDataGrid.ItemsSource = MyDG ;


Данные отображаются в datagrid правильно.
у меня есть еще одна функция, вызванная событием MyDevicesDataGrid_SelectionChanged
когда элемент выбран, я хочу получить первое значение, которое является [SN] из таблицы (A).
что я сделал, так это создал класс, как показано ниже:

private string sN;
       private string material;
       private string dDHW;
       private bool dDAvilabil;
       private string dDOS;

       public string SN
       {
           get
           {
               return sN;
           }

           set
           {
               sN = value;
           }
       }

       public string Material
       {
           get
           {
               return material;
           }

           set
           {
               material = value;
           }
       }

       public string DDHW
       {
           get
           {
               return dDHW;
           }

           set
           {
               dDHW = value;
           }
       }

       public bool DDAvilabil
       {
           get
           {
               return dDAvilabil;
           }

           set
           {
               dDAvilabil = value;
           }
       }

       public string DDOS
       {
           get
           {
               return dDOS;
           }

           set
           {
               dDOS = value;
           }
       }
   }


и я пытаюсь получить SN вот так:
string id = (MyDevicesDataGrid.SelectedItem as DevicesDetails).SN;


но я получаю нулевой результат и сообщение об ошибке:ссылка на объект не установлена на экземпляр объекта.

любой знает, как это сделать

Что я уже пробовал:

строку ИД = (MyDevicesDataGrid.Элемент как DevicesDetails).ЗП;

вар для selecteditem = MyDevicesDataGrid.Элемент как DevicesDetails;

Eric Lynch

Ваш запрос LINQ, по-видимому, возвращает динамический тип; в то время как ваше назначение, по-видимому, ожидает определенного типа (DevicesDetail). Когда вы используете предложение "as", оно будет приведено к указанному типу (если объект относится к этому типу); в противном случае оно даст null. Вы не можете просто привести динамический тип к определенному типу. Это не действует. Вам нужно будет либо изменить свой запрос LINQ, чтобы выбрать нужный тип, либо написать метод для самостоятельного преобразования позже.

Добавление: чтобы быть немного яснее, вы можете изменить "select new { ... }" на "select new DevicesDetail { ... }", а затем перейти к назначениям типа "SN = DT.SN" в скобках (где находятся биты"...").

Member 13199484

Здравствуйте Мистер Эрик
спасибо за ваш комментарий, вы правы, я перехожу от динамического к конкретному, так как переменная after (AS), которая является (SN), имеет один и тот же тип в таблицах двух БД и в списке (DevicesDetail).
однако я пытаюсь импортировать полную выбранную строку в объект, она сохраняется, но я не могу извлечь нужный мне столбец, так же как и:
var Item = MyDevicesDataGrid.SelectedItem ;
здесь у меня есть вся строка, сохраненная на "item", и если я хочу получить первое значение, я напишу : (item.?), у меня есть 4 варианта (get type, to string, ....).
на самом деле я не знаю, как лучше всего получить первое значение ячейки

Eric Lynch

Извините, случайно ответил на ваш вопрос вместо вашего комментария...


Я бы рекомендовал изменить ваш запрос LINQ, чтобы получить определенный тип, как это было предложено в исходном ответе.

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

строку ИД = (MyDevicesDataGrid.Элемент как динамический).ЗП;

Member 13199484

Я пробовал его, он вернул нулевой результат.
я попытаюсь отредактировать запрос LINQ, чтобы указать тип.
спасибо.

Eric Lynch

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

Когда вы говорите: "он вернул ноль", что такое "это"?

Является ли "MyDevicesDataGrid.SelectedItem" нулевым? Если это так, то это означает, что пользователь не выбрал строку таблицы данных в пользовательском интерфейсе?

Является ли "(MyDevicesDataGrid.SelectItem as dynamic)" нулевым? Если это так, я бы использовал отладчик для изучения "MyDevicesDataGrid.SelectedItem", чтобы определить его базовый тип.

Is "(MyDevicesDataGrid.SelectedItem as dynamic).SN" null? Если это так, то либо столбец базы данных может быть пустым, либо компилятор может иметь некоторые проблемы с разрешением динамического свойства.

И специфичность, и отладчик помогают при попытке диагностировать эти проблемы. Тем не менее, там, где это возможно, я предпочитаю просто работать с определенным типом для конечного результата запроса LINQ, чтобы избежать всех вышеперечисленных сложностей. Я часто использую динамические типы для внутренних частей запроса LINQ, но почти всегда выбираю определенный тип для самого внешнего результата.

Member 13199484

хорошее объяснение всех возможностей от вас.
такой код возвращает значение null
- MyDevicesDataGrid.SelectItem как динамический
- (MyDevicesDataGrid.SelectedItem как динамический).SN
я согласен с вами в определении типа.
я выбираю динамический способ, чтобы избежать пропущенной синхронизации между двумя таблицами.
я пропускаю часть кода, чтобы проверить каждую строку в первой таблице с ее аналогом во второй таблице, потому что все операции, применяемые к одной таблице и второй таблице, импортируют данные из первой таблицы по конкретному событию, поэтому я не могу убедиться, что таблицы полностью совпадают, поэтому я взял первые два столбца из первой таблицы, а остальные-из второй таблицы.
я действительно пропустил 3 строки кода, чтобы столкнуться с разрывом в 3 метра.
я исправлю поведение приложения.
спасибо снова

0 Ответов