Разделение / сравнение записей DataTable: есть ли лучший способ? - PullRequest
0 голосов
/ 03 декабря 2011

У меня были проблемы с заголовком этого вопроса, поскольку трудно выразить словами то, что я пытаюсь сделать, но в этом примере у меня есть три таблицы данных, которые взяты из базы данных. таблица "people", таблица "groups" и таблица ссылок peopleInGroups.

У меня есть два списка: один для отображения имен людей, которые входят в определенную группу, и один для отображения людей, которых нет в этой группе. Используя отношение данных, я могу получить записи о людях, которые входят в группу, из groupID как datarow [] и заполнить listView "people in group" простым циклом foreach, но я изо всех сил пытался найти способ заполнить "people не в группе "listView.

Решение, к которому я наконец пришел, состояло в том, чтобы создать две новые таблицы данных, одну для «в группе» и одну для «не в группе» и заполнить / удалить из них, где это необходимо. Однако процесс кажется грязным и немного медленным, и я уверен, что должен быть лучший способ достичь тех же целей.

Код метода (немного отредактированный, чтобы попытаться сделать его более общим):

private void PopulateListBoxes(string comboBoxGroupName)
    {
        // create copies of the "people" DataTable, one empty one full
        DataTable dtPeopleNotInGroup = myDataSet.Tables["people"].Copy();
        DataTable dtPeopleInGroup = myDataSet.Tables["people"].Clone();
        DataView dvPeopleNotInGroup = new DataView(dtPeopleNotInGroup, "", "PersonID", DataViewRowState.CurrentRows);
        DataView dvPeopleInGroup = new DataView(dtPeopleInGroup);

        // find the specific group row from the groups table using a specific groupID
        string stm = "groupid = somegroupid"
        DataRow[] drGroupID = dsMainDB.Tables["groups"].Select(stm);

        foreach (DataRow groupIDRow in drGroupID)
        {
            foreach (DataRow peopleInGroupRow in groupIDRow.GetParentRows(myDataSet.Relations["relPersonID"]))
            {
                // delete this row from the full datatable
                int removeThisPerson = dvPeopleNotInGroup.Find(peopleInGroupRow["PersonID"]);
                dvPeopleNotInGroup.Delete(removeThisPerson);

                // add this row to the empty data table
                dtPeopleInGroup.ImportRow(peopleInGroupRow);
            }
        }

        dvPeopleNotInGroup.Sort = "lastname";
        dvPeopleInGroup.Sort = "lastname";

        // populate the "In group" listView from the data view
        foreach (DataRowView inGroupRowView in dvPeopleInGroup)
        {
            listViewPeopleInGroup.Items.Add(new ListViewItem(new string[] { inGroupRowView["PersonID"].ToString(),
               inGroupRowView["FirstName"].ToString() + " " + inGroupRowView["LastName"].ToString() }));
        }

        // populate the "Not in group" listView from the data view
        foreach (DataRowView notInGroupRowView in dvPeopleNotInGroup)
        {
            listViewPeopleNotInGroup.Items.Add(new ListViewItem(new string[] { notInGroupRowView["PersonID"].ToString(),
               notInGroupRowView["FirstName"].ToString() + " " + notInGroupRowView["LastName"].ToString() }));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...