C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.92952 の関連記事表示

<< 0 >>
■92952  Re[3]: Listの入れ子があるListをソースに設定する方法について
□投稿者/ 魔界の仮面弁士 -(2019/11/11(Mon) 18:51:05)
    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 の重複チェックは自階層内のチェックだけで済みますね。
記事No.92931 のレス /過去ログ161より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -