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

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

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

全過去ログを検索

<< 0 >>
■38114  NotifyIconとMe.Focused
□投稿者/ lino. -(2009/07/07(Tue) 10:18:43)

    分類:[.NET 全般] 

    いつもお世話になっています。vb2005です。

    NotifyIconをクリックすると、Formがアクティブの時はMe.Visible = Falseにして、そうでない時はMe.Visible = Trueのままアクティブにさせるようにしたいのですが、

    If Me.Visible = True Then
    If Me.Focused Then 'Formがアクティブの時
    Me.Visible = False
    Else 'アクティブでない時は先にアクティブにすることを優先する
    Me.Activate()
    End If
    End If

    とすると「ない時はMe.Visible = Trueのままアクティブにさせる」はちゃんと作動するのですが、「Formがアクティブの時」はクリックしてもMe.Visible = Falseになりません。
    どう直せばちゃんと動くのか、考えても分からないので、投稿させていただきました。どうか、お教え願えませんでしょうか。
親記事 /過去ログ66より / 関連記事表示
削除チェック/

■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より / 関連記事表示
削除チェック/

■92980  Re[4]: Listの入れ子があるListをソースに設定する方法について
□投稿者/ 河童 -(2019/11/12(Tue) 13:57:18)
    No92952 (魔界の仮面弁士 さん) に返信
    
    たくさんアドバイスいただいて、ありがとうございます。
    少し頭が混乱してきました。
    
    申し訳ないです。やっぱりリストを使って処理を行いたいです。
    
    Listの入れ子があるListをソースに設定する方法について
    やりたいことを整理しました。
    
    画面上にDataGridViewが3つあります。
    dgvGroup
    dgvTeam
    dgvUser
    
    DataGridViewのソースとなるデータは、外部ファイルからリスト型で読み込まれます。
    この処理は実装済みです。
    読み込んだリスト型のデータを各DataGridViewのソースに設定したいです。
    
    画面上の動きとしては、
    画面のロード時にグループ(GroupA)を表示
    「GroupA」を選択するとチーム(TeamA)を表示
    「TeaA」を選択するとユーザ(User1)を表示
    のように段階を踏ませたいです。
    
    グループ、チーム、ユーザの新規追加は、
    別フォームを開いてから登録処理を実行させようと思っています。
    
    今わからないことは、
    段階的にDataGridViewを表示させる方法です。
    ロード時に入れ子のリストごとに新たにリスト作成して
    それをDataGridViewのソースに設定しています。
    
    どのように各DataGridViewのリストのソースを設定すれば良いでしょうか?
    
    Groupが選択されたときにTeamのDataGridViewのソースの作成方法
    Teamが選択されたときのUserのDataGridViewのソースの作成方法
    group_numとteam_numのキーの渡し方がわかりません。
    
    
            // グループリスト
            List<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; }
            }
    
    
            // DataGridView用
            public class dgvGroupInfo
            {
                public int group_num { get; set; }
                public string group_name { get; set; }
            }
            public class dgvTeamInfo
            {
                public int team_num { get; set; }
                public string team_name { get; set; }
            }
            public class dgvUserInfo
            {
                public int user_num { get; set; }
                public string user_name { get; set; }
            }
    
            List<dgvGroupInfo> DgvGroupLst;         // グリッド用グループリスト
            int RowIdx1 = 0; // 選択行インデックス
            List<dgvTeamInfo> DgvTeamLst;       // グリッド用チームリスト
            int RowIdx2 = 0; // 選択行インデックス
            List<dgvUserInfo> DgvUserLst;     // グリッド用ユーザリスト
            int RowIdx3 = 0; // 選択行インデックス
    
            private void FormMain_Load(object sender, EventArgs e)
            {
    
                // リストデータ作成
                GroupLst = new List<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);
    
                // DataGridViewソース作成
                CreatDgvSource();
    
            }
     
            void CreatDgvSource()
            {
                // リスト更新、表示
                dgvGroup.DataSource = null;
                dgvTeam.DataSource = null;
                dgvUser.DataSource = null;
    
                // リストのデータを取得
                int iRet = Create_DgvLst();
                if (iRet == -1) return;
    
                // グループのソースセット
                dgvGroup.DataSource = DgvGroupLst;
    
                // チームのソースセット
                dgvTeam.DataSource = DgvTeamLst;
    
                // ユーザのソースセット
                dgvUser.DataSource = DgvUserLst;
    
                // 選択行設定
                if (RowIdx1 >= dgvGroup.Rows.Count) RowIdx1--;
                if (dgvGroup.Rows.Count > 0 && RowIdx1 < 0) RowIdx1 = 0;
             
                dgvGroup.Refresh();
                dgvTeam.Refresh();
                dgvUser.Refresh();
            }
    
            private int Create_DgvLst()
            {
                // グリッド用リストを初期化
                DgvGroupLst = new List<dgvGroupInfo>();
                DgvTeamLst = new List<dgvTeamInfo>();
                DgvUserLst = new List<dgvUserInfo>();
    
                // 取得データからリストを作成
                foreach (var g in GroupLst) // グループ
                {
                    dgvGroupInfo d1 = new dgvGroupInfo();
                    d1.group_num = g.group_num;
                    d1.group_name = g.group_name;
    
                    DgvGroupLst.Add(d1);
    
                    foreach (var t in g.teamList)  // チーム
                    {
                        dgvTeamInfo d2 = new dgvTeamInfo();
                        d2.team_num = t.team_num;
                        d2.team_name = t.team_name;
    
                        DgvTeamLst.Add(d2);
    
                        foreach (var u in t.userList)  // ユーザ
                        {
                            dgvUserInfo d3 = new dgvUserInfo();
                            d3.user_num = u.user_num;
                            d3.user_name = u.user_name;
    
                            DgvUserLst.Add(d3);
                        }
                    }
                }
                return 0;
            }
    
    
記事No.92931 のレス /過去ログ161より / 関連記事表示
削除チェック/

■92983  Re[5]: Listの入れ子があるListをソースに設定する方法について
□投稿者/ 魔界の仮面弁士 -(2019/11/12(Tue) 14:24:25)
    No92980 (河童 さん) に返信
    > 画面上にDataGridViewが3つあります。

    これらは ReadOnly でしょうか?

    編集可能とする場合は、さらに

    (1)主キーの変更を許可するか否か
    (2)データの削除を許可するか否か
    (3)新規レコードの作成を許可するか否か

    についても考える必要があります。
    (許可する場合、それぞれに応じた追加の処理が必要です)


    > 読み込んだリスト型のデータを各DataGridViewのソースに設定したいです。

    その場合のコードは No92952 に示しています。



    > DataGridViewのソースとなるデータは、外部ファイルからリスト型で読み込まれます。
    > この処理は実装済みです。

    上記の入力処理(読み込み)の後、
    出力処理(リストの内容を外部ファイルに書き戻す処理)も発生しますか?

    入力処理(読み込み)だけなら、さほど問題は無いのですが、
    出力処理もある場合、単純なファイルの再生成だけで良いのかでも設計が変わってきます。

    上書き再生成で出力するのならば良いですが、データベース等が相手だと、
     -- group_num が 100 のレコードを、データベースから削除する
     DELETE FROM GRP_TBL WHERE NUM = 100
    のように「削除対象の group_num の一覧」を覚えておく必要があるため、
    単純に GroupLst から .Remove() されるだけだと都合が悪くなるかもしれません。
    主キー項目の書き換えを許可する場合も同様。



    > 段階的にDataGridViewを表示させる方法です。

    No92952 の RowEnter では駄目ですか?


    > int RowIdx1 = 0; // 選択行インデックス

    DataGridView は列クリックでのソートも可能なので、インデックスでのアクセスはお奨めしません。

    .DataSource にバインドしている場合には、 No92952 に示したように、
    選択行の DataBoundItem プロパティから該当レコードを参照するようにします。
記事No.92931 のレス /過去ログ161より / 関連記事表示
削除チェック/

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

    > これらは ReadOnly でしょうか?
    全部ReadOnly に設定しています。


    > 上記の入力処理(読み込み)の後、
    > 出力処理(リストの内容を外部ファイルに書き戻す処理)も発生しますか?
    はい、発生します。出力するときに同じリスト型にして、それを出力する形を取りたいです。

    >
    >>段階的にDataGridViewを表示させる方法です。
    >
    > No92952 の RowEnter では駄目ですか?
    もう一度確認してみます。


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



<< 0 >>

パスワード/

- Child Tree -