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

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

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

全過去ログを検索

<< 0 >>
■78888  Re[1]: 同じ分数のグループに纏めるには
□投稿者/ shu -(2016/02/23(Tue) 11:03:09)
    No78837 (どど さん) に返信

    > 受信した現在時刻と現在値をString.Split、DateTime、DecimalなどでParseする
    どこから?一定間隔で外部からのデータ供給がある場合と対象データを一括で
    取り込むことが出来る場合とで処理が異なります。


    > 前回時刻と現在時刻の年月日時分を比べる
    時刻はどんなデータになっている?


    > 一致していないなら前回時刻、始値、安値、高値、終値を出力し、
    どこへどのように出力する?


    > 前回時刻、始値、安値、高値、終値に現在の値を設定する
    初期の前回時刻の設定をデータ上発生しない値にしておくか初期データフラグを用意することで
    最初のデータと分の変わり目の処理を1つに纏めることが出来ます。




記事No.78837 のレス /過去ログ134より / 関連記事表示
削除チェック/

■92989  Re[7]: Listの入れ子があるListをソースに設定する方法について
□投稿者/ 河童 -(2019/11/12(Tue) 16:00:42)
    No92983 (魔界の仮面弁士 さん) に返信

    GroupLst を BindingList にしました。
    そして RowEnter イベントを追加するとリスト表示することができました。
    ありがとうございます。

    続けて質問させてください。

    追加や編集の処理を行うときGroupLst にどのように値を更新すれば良いですか?
    またこのDataGridView のソースをそのままGroupLstに戻す方法を教えてください。
    GroupLst は、上書き更新で行いたいです。



    // グループリスト
    BindingList<GroupInfo> GroupLst;
    public class GroupInfo
    {
    public int group_num { get; set; }
    public string group_name { get; set; }
    public List<TeamInfo> teamList = new List<TeamInfo>();
    }
    public class TeamInfo
    {
    public int team_num { get; set; }
    public string team_name { get; set; }
    public List<UserInfo> userList = new List<UserInfo>();
    }
    public class UserInfo
    {
    public int user_num { get; set; }
    public string user_name { get; set; }
    }

    private void FormMain_Load(object sender, EventArgs e)
    {

    // リストデータ作成
    GroupLst = new BindingList<GroupInfo>();
    GroupInfo d = new GroupInfo();
    d.group_num = 1;
    d.group_name = "GroupA";
    d.teamList = new List<TeamInfo>();
    TeamInfo t = new TeamInfo();
    t.team_num = 1;
    t.team_name = "TeamA";
    t.userList = new List<UserInfo>();
    UserInfo u = new UserInfo();
    u.user_num = 1;
    u.user_name = "User1";
    t.userList.Add(u);
    d.teamList.Add(t);
    GroupLst.Add(d);

    // リストデータ作成
    //GroupLst = new List<GroupInfo>();
    GroupInfo d2 = new GroupInfo();
    d2.group_num = 2;
    d2.group_name = "GroupB";
    d2.teamList = new List<TeamInfo>();
    TeamInfo t2 = new TeamInfo();
    t2.team_num = 1;
    t2.team_name = "TeamB";
    t2.userList = new List<UserInfo>();
    UserInfo u2 = new UserInfo();
    u2.user_num = 1;
    u2.user_name = "User2";
    t2.userList.Add(u2);
    d2.teamList.Add(t2);
    GroupLst.Add(d2);


    // DataGridViewソース作成
    CreatDgvSource();
    }

    void CreatDgvSource()
    {
    // リスト更新、表示
    dgvGroup.DataSource = null;

    // グループのソースセット
    dgvGroup.DataSource = GroupLst;

    dgvGroup.Refresh();
    }

    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);
    }
記事No.92931 のレス /過去ログ161より / 関連記事表示
削除チェック/

■92996  Re[8]: Listの入れ子があるListをソースに設定する方法について
□投稿者/ 魔界の仮面弁士 -(2019/11/12(Tue) 17:52:35)
    2019/11/12(Tue) 20:10:28 編集(投稿者)

    No92989 (河童 さん) に返信
    > GroupLst を BindingList にしました。

    BindingList<T> にしたのは GroupLst だけで、
    teamList や userList は List<T> のままにしたいということでしょうか。

    その場合、dgvUser.DataSource には team.userList ではなく
    new BindingList<UserInfo>(team.userList) をセットします。
    ※dgvTeam も同様。


    また、DataGridView 側から新規行の追加や編集・削除を行えないようにしたい場合には、
    BindingList<T> のプロパティで制御できます。
     GroupLst.AllowNew = false;
     GroupLst.AllowEdit = false;
     GroupLst.AllowRemove = false;

    List<T> の場合は上記が使えませんので、DataGridView の
    AllowUserTo何某 系プロパティでも代用してあげてください。


    DataGridView に List<T> を渡していた場合、リストを操作しても
    編集結果が DataGridView に伝わらないので、画面に反映させるために
    少し追加のコードが必要になることに注意して下さい。


    BindingList<T> や DataSet/DataTable/DataView を渡していた場合は、
    これらの変更通知機能によって、画面が自動的に更新されます。


    > public int team_num { get; set; }
    > public string team_name { get; set; }
    > public List<UserInfo> userList = new List<UserInfo>();

    team_num と team_name は「読み書き可能なプロパティ」になっていますが、
    userList は「読み書き可能なフィールド」になっていますね。

    userList は「読み取り専用プロパティ」または「読み取り専用フィールド」の方がベターかと思います。
    TeamInfo 側を改修できない事情がある場合は仕方ないですが。


    > 追加や編集の処理を行うときGroupLst にどのように値を更新すれば良いですか?

    DataGridView 側からの編集ではなく、リスト側への操作となりますので、
    たとえば【削除処理】なら、先の DataBoundItem を通じて

     if (dgvGroup.CurrentRow!=null)
     {
      var selectedGroup = (GroupInfo)dgvGroup.CurrentRow.DataBoundItem;
      GroupLst.Remove(selectedGroup); // リストから取り除く
     }

    とします。

    GroupLst が BindingList<T> が相手の場合は上記だけで良いですが、
    相手が List<T> の場合は、削除後に DataGridView への
    再バインド処理も必要となります。
    ※List<T> 時に再バインドしなかった場合、DataGridView 上の件数が
     変化しないため、削除済み行へのアクセスされてしまい、例外が発生します。



    【編集処理】の場合も同様に、CurrentRow からバインド先のアイテムを得て、
    それをそのまま編集すれば OK です。
      var selectedGroup = (GroupInfo)dgvGroup.CurrentRow.DataBoundItem;
      selectedGroup.group_num = 123; // 新しいnum
      selectedGroup.group_name = "新しい名前";
    上記の selectedGroup を操作すると、GroupLst 内の該当グループも
    連動して書き換わります。GroupLst[n].group_name を操作しているのと同義。

    ただしこれだけだと、編集結果が画面に即座に反映されないので、上記の後に
      // BindingList<GroupInfo> から、変更通知を伝える
      GroupLst.ResetItem(GroupLst.IndexOf(selectedGroup));
    もしくは
      // DataGridView から、行に対して再描画依頼を投げる
      dgvGroup.InvalidateRow(dgvGroup.CurrentRow.Index);
    のようにして、変更したことを DataGridView に通知する必要があります。



    【追加処理】については、DataGridView とは無関係に
      // BindingList<GroupInfo> の場合
      var newGroup = GroupLst.AddNew();
      newGroup.group_num = 12345;
      newGroup.group_name = "新しいグループ";
      // BindingList<T> の場合、追加時の画面更新は自動的に行われる
    もしくは
      // List<GroupInfo> の場合
      var newGroup = new GroupInfo();
      newGroup.group_num = 12345;
      newGroup.group_name = "新しいグループ";
      GroupLst.Add(newGroup);
      // List<T> には変更通知依頼が無いので、自分で再バインドして通知する
      var oldSource = dgvGroup.DataSource;
      dgvGroup.DataSource = null;
      dgvGroup.DataSource = oldSource;
    という感じになります。


    編集・追加時にキーが重複することを防ぎたい場合には、
    事前にリスト内を列挙して、同じキーが入っていないことを
    検査しておいてください。


    グループを新規追加する場合は以上で終わりですが、
    チームの場合は親グループの teamList への追加処理が必要です。
    (ユーザーも同様に、親チームの userList へ追加する)


    追加先となるチームのリストは先ほどと同様に、親階層の DataGridView から
     GroupInfo selectedGroup = (GroupInfo)dgvGroup.CurrentRow.DataBoundItem;
     var teamList = selectedGroup.teamList;
    のように得ることができます。


    > またこのDataGridView のソースをそのままGroupLstに戻す方法を教えてください。

    上記の処理で、GroupLst の内容は既に書き換わっています。
記事No.92931 のレス /過去ログ161より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -