| ■No92945 (河童 さん) に返信 > 1.リストの値をテーブルにセットする方法 > 入れ子があるリストのグループリストからどのようにDataSetに値を設定させれば良いでしょうか?
リストをループ処理して、DataSet のテーブルに行を Add していってください。
なお、DataGridView を readonly とせず、編集目的でも用いる場合、 DataSet とリストとで二重管理になってしまい、更新時の同期が面倒なので、 いっそのことリストは使わず、DataSet だけで管理するという選択肢もあるかと思います。
その場合、DataSet の構造はこんな感じになります。 (user_num が全体で一意ではなく、group_num, team_num ごとに一意となる場合)
DataSet ├Tables["GroupInfo"] … PrimaryKey = group_num │├Columns["group_num"] │└Columns["group_name"] ├Tables["TeamInfo"] … PrimaryKey = group_num, team_num │├Columns["group_num"] … 非表示列 親GroupInfoの group_num が入る。 │├Columns["team_num"] │└Columns["team_name"] ├Tables["UserInfo"] … PrimaryKey = group_num, team_num, user_num │├Columns["group_num"] … 非表示列。親Teamの group_num が入る。 │├Columns["team_num"] … 非表示列。親Team の team_num が入る。 │├Columns["user_num"] │└Columns["user_name"] ├Relations["Group_Team"] └Relations["Team_User"]
DataGridView を編集目的でも用いる場合、 num の変更を許可するかどうか(変更を許可するなら競合検査も必要)や、 レコードの削除や新規行の追加やを許可するかどうかも検討してください。
もしも DataSet 案は使わず、当初の設計通り「リスト」だけで行う場合には、 階層の移動は手動で行うことになります。たとえばこんな感じです。 (DataGridView で編集させる目的なら、List<> ではなく BindingList<> がお奨め)
private void FormMain_Load(object sender, EventArgs e) { dgvGroup.DataSource = GroupLst; }
private void dgvGroup_RowEnter(object sender, DataGridViewCellEventArgs e) { dgvTeam.DataSource = null; var group = dgvGroup.Rows[e.RowIndex].DataBoundItem as GroupInfo; dgvTeam.DataSource = (group != null) ? (object)group.teamList : typeof(TeamInfo); if (group == null || !group.teamList.Any()) { dgvUser.DataSource = new UserInfo[0]; } }
private void dgvTeam_RowEnter(object sender, DataGridViewCellEventArgs e) { dgvUser.DataSource = null; var team = dgvTeam.Rows[e.RowIndex].DataBoundItem as TeamInfo; dgvUser.DataSource = (team != null) ? (object)team.userList : typeof(UserInfo); }
> 2.キーの設定方法について >>グループ、チームとユーザは今後増えていきます。 >>チームは複数のグループには属しません。 >>ユーザは複数のチームには属しません。 > データを追加する必要が今後でてくるのですが、そのときのチームとユーザの番号を一意にするのではなく、 > 同じ番号も使用したいと思っています。
group_num は、全体で一意。 team_num は、全体で一意ではなく、group ごとに一意。 user_num は、全体で一意ではなく、group_num, team_num ごとに一意。
ということでしょうか。 だとすると、num の重複チェックは自階層内のチェックだけで済みますね。 |