C # и WPF - набор данных в DataGrid - объединение двух таблиц в наборе данных - PullRequest
0 голосов
/ 09 декабря 2018

Я хотел бы решить одну проблему, с которой столкнулся, когда создавал приложение, которое может помочь отображать и изменять данные в базе данных Access с помощью программы C # WPF.

Что у меня есть - чтобы прояснить это - этоБаза данных, к которой у меня есть доступ.База данных содержит три таблицы и отношения.Есть также несколько запросов, потому что в прошлом он полностью работал на VBA.

Теперь я получил запрос на создание удобного приложения для этой БД (базы данных).

Что я могу сделать, так это загрузить данные из основной таблицы, позвольте мне сказать таблицу "Детали".Эта таблица содержит некоторые данные о деталях, такие как идентификатор, имя, идентификатор группы и т. Д. Существует также другая таблица с именем Группа.Группа содержит 3 имени группы.Например, это может быть Программное обеспечение, Оборудование, Другое.

Если бы я был пользователем и знал SQL, я бы написал: EDIT: / edited select

SELECT ID, Parts.Name , Parts.Group , GroupName.Group from PARTS 
LEFT JOIN Group ON Parts.GroupID = Group.ID 

Это также создается в QUERY в файле Access DB.И после щелчка на этом представлении вы получаете вид, который вам нравится, - все еще в VBA в файле Access DB.

Что я сделал в C #, так это загрузил все таблицы, которые содержит БД.

и у меня есть

ds.Tables["Parts"]
ds.Tables["Groups"]

Когда вы назначаете

DataView dv = new DataView;
dv = DataSet.Tables["Parts"].DefalutView; 
//PreviouslyCretedDatagridInWPF:
dataGrid.DataSource = dv;  

Если вы загружаете приложение, загрузка Grid работает быстро, и я могу загрузить окно за одну секунду -данные в таблице «частей» - это около 10000 строк и 27 столбцов.

Но если я попытаюсь выполнить соединение, используя, например, с простым условием If, например,

ds.Tables["TempParts"], это может быть просто простая клонированная таблица с добавленным столбцом в строке одного типа.например, 28.

for(i=0;i<ds.Tables["Parts"].Rows.Count;i++) {     
    for( j=0;j<ds.tables["groups"].Rows.Count;j++){
    //0is ID column//10is groupIDcolumn)
    if(ds.Tables["TempParts"].Rows[i][10] == ds.Tables["groups"].Rows[j][0]) 
     { ds.Tables["TempParts"].Rows[i][28]= ds.Tables["groups"].Rows[j][0];}
} 

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

Следующим шагом, конечно же, является отображение строки, по которой щелкнули, в новом окне, внесение некоторых изменений и применение с использованием изменений, поэтому я использовал условие в окне редактирования, но написал его вручную, что означает, что пользователь выбирает «оборудование».он присваивает номер 1 столбцу groupID в таблице деталей. Я чувствую, что это также не правильный способ сделать это или нет?

Я считаю случай, когда в будущем группы таблиц также будут доступны для редактирования, поэтому «группы» и ID не могут быть сохранены в каком-либо статическом массиве или структуре или около того.Ну, я должен работать с загруженными данными в таблицах данных.

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

Вопрос в том, что является более быстрым / удобным способом сделать это.

Делать это над (в) БД, делать с самим кодом, использовать какую-нибудь библиотеку, которая может выполнять такие операции быстрее?

Конечно, в коде может быть какая-то ошибка, потому что у меня нет реального кода здесь, и я пытался упростить его настолько, насколько мог.

Спасибо за ваше время.

...