У меня были проблемы с заголовком этого вопроса, поскольку трудно выразить словами то, что я пытаюсь сделать, но в этом примере у меня есть три таблицы данных, которые взяты из базы данных. таблица "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() }));
}
}