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

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

C# と VB.NET の入門サイト

vb.net datagridiew内にボタンを配置したい

[トピック内 15 記事 (1 - 15 表示)]  << 0 >>

■99920 / inTopicNo.1)  vb.net datagridiew内にボタンを配置したい
  
□投稿者/ ゆい (59回)-(2022/06/21(Tue) 13:18:45)

分類:[VB.NET/VB2005 以降] 

2022/06/21(Tue) 13:32:16 編集(投稿者)
2022/06/21(Tue) 13:32:13 編集(投稿者)

vb.netでDataGridView内にボタンを入れたいです。

やりたい流れとしては

ID passwordを入力し、検索ボタンを押下したら、datagridview内にユーザ情報が出力され、
その最後の列のそれぞれの行にボタンを配置したいです。

Dim colBtn As New DataGridViewButtonColumn()
colBtn.Name = "表示"
colBtn.Text = "ボタン"
dgUserList.Columns.Add(colBtn)

上記のコードを検索ボタンクリック時イベントに入れたとき、検索ボタンを二回押下した際に、ユーザ情報のカラムまで
ボタンに浸食されてしまったため、上記コードを入れる位置を変更したらいいのではないかと考えているんですが、
もしまったく違うより良い方法があれば教えていただきたいです。

もしくは、上記コードを入れるべき場所を教えていただきたいです。

宜しくお願いします。
引用返信 編集キー/
■99921 / inTopicNo.2)  Re[1]: vb.net datagridiew内にボタンを配置したい
□投稿者/ WebSurfer (2495回)-(2022/06/21(Tue) 14:36:32)
No99920 (ゆい さん) に返信

開発環境を書いてください。OS, Visual Studio のバージョン、.NET Framework なのか .NET Core / .NET どっち
なのかとそのバージョンなど。

> その最後の列のそれぞれの行にボタンを配置したいです。

そのボタンの目的は何でしょう? ユーザーがクリックすると何かするのでしょうけど、何をするのでしょうか?
引用返信 編集キー/
■99922 / inTopicNo.3)  Re[2]: vb.net datagridiew内にボタンを配置したい
□投稿者/ ゆい (60回)-(2022/06/21(Tue) 14:56:13)
回答ありがとうございます。
かなりの説明不足ですみません。

visual studio2022を使用しており、
.net Frameworkで作業をしております。

ボタンを設置する目的としては、dataGridView内のボタンを押下した際に、
押下された行の各項目を別のテキストボックスに書き出すことです。

上記の書き出しについては完了したのですが、ボタンの配置にだけかなりてこずっております。

宜しくお願いいたします。

No99921 (WebSurfer さん) に返信
> ■No99920 (ゆい さん) に返信
>
> 開発環境を書いてください。OS, Visual Studio のバージョン、.NET Framework なのか .NET Core / .NET どっち
> なのかとそのバージョンなど。
>
>>その最後の列のそれぞれの行にボタンを配置したいです。
>
> そのボタンの目的は何でしょう? ユーザーがクリックすると何かするのでしょうけど、何をするのでしょうか?
引用返信 編集キー/
■99923 / inTopicNo.4)  Re[1]: vb.net datagridiew内にボタンを配置したい
□投稿者/ furu (159回)-(2022/06/21(Tue) 15:15:08)
No99920 (ゆい さん) に返信
> ID passwordを入力し、検索ボタンを押下したら、datagridview内にユーザ情報が出力され、
> その最後の列のそれぞれの行にボタンを配置したいです。
安易な方法

ユーザ情報が出力後
既にボタン列があったら、ボタン列の表示位置を最後にする。
ボタン列がなかったら、ボタン列を追加する。
引用返信 編集キー/
■99924 / inTopicNo.5)  Re[2]: vb.net datagridiew内にボタンを配置したい
□投稿者/ ゆい (61回)-(2022/06/21(Tue) 15:32:35)
回答ありがとうございます。

If Not (dgUserList.Columns.Contains("表示")) Then
Dim colBtn As New DataGridViewButtonColumn()
colBtn.Name = "表示"
colBtn.Text = "ボタン"
dgUserList.Columns.Add(colBtn)
End If

上記コードのようにifで判定するコードを入れてみたのですが、
検索ボタンを一度だけ押すと正常に動作するのですが、
検索ボタンを二回連続で押すと、
隣の列がボタンに変化してしまいます

No99923 (furu さん) に返信
> ■No99920 (ゆい さん) に返信
>>ID passwordを入力し、検索ボタンを押下したら、datagridview内にユーザ情報が出力され、
>>その最後の列のそれぞれの行にボタンを配置したいです。
> 安易な方法
>
> ユーザ情報が出力後
> 既にボタン列があったら、ボタン列の表示位置を最後にする。
> ボタン列がなかったら、ボタン列を追加する。
引用返信 編集キー/
■99925 / inTopicNo.6)  Re[3]: vb.net datagridiew内にボタンを配置したい
□投稿者/ WebSurfer (2496回)-(2022/06/21(Tue) 15:51:54)
No99922 (ゆい さん) に返信

> 上記の書き出しについては完了したのですが、ボタンの配置にだけかなりてこずっております。

どのようなコードを書いているのか分かりませんが、DataGridView に DataGridViewButtonColumn を
含めてすべての列を作っておいて、[検索]ボタンクリックでデータバインドするようにしてはいか
がですか?


引用返信 編集キー/
■99926 / inTopicNo.7)  Re[1]: vb.net datagridiew内にボタンを配置したい
□投稿者/ 大谷刑部 (196回)-(2022/06/21(Tue) 16:14:23)
No99920 (ゆい さん) に返信
> 2022/06/21(Tue) 13:32:16 編集(投稿者)
> 2022/06/21(Tue) 13:32:13 編集(投稿者)
>
> vb.netでDataGridView内にボタンを入れたいです。
>
> やりたい流れとしては
>
> ID passwordを入力し、検索ボタンを押下したら、datagridview内にユーザ情報が出力され、
> その最後の列のそれぞれの行にボタンを配置したいです。
>
> Dim colBtn As New DataGridViewButtonColumn()
> colBtn.Name = "表示"
> colBtn.Text = "ボタン"
> dgUserList.Columns.Add(colBtn)
>
> 上記のコードを検索ボタンクリック時イベントに入れたとき、検索ボタンを二回押下した際に、ユーザ情報のカラムまで
> ボタンに浸食されてしまったため、上記コードを入れる位置を変更したらいいのではないかと考えているんですが、
> もしまったく違うより良い方法があれば教えていただきたいです。

そもそも画面デザインで定義せず、物理的にコードでカラムを追加しようとしている理由は何でしょう?

引用返信 編集キー/
■99927 / inTopicNo.8)  Re[3]: vb.net datagridiew内にボタンを配置したい
□投稿者/ WebSurfer (2497回)-(2022/06/21(Tue) 16:28:55)
No99922 (ゆい さん) に返信

No99925 のサンプルコードを載せておきます。

Form にはデザイン画面で Button, DataGridView, BindingSource をドラッグ&ドロップして、
イベントハンドラを設定しています。

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form5 : Form
    {
        private DataGridViewTextBoxColumn column1;
        private DataGridViewTextBoxColumn column2;
        private DataGridViewTextBoxColumn column3;
        private DataGridViewButtonColumn column4;

        public Form5()
        {
            InitializeComponent();

            this.column1 = new DataGridViewTextBoxColumn();
            this.column2 = new DataGridViewTextBoxColumn();
            this.column3 = new DataGridViewTextBoxColumn();
            this.column4 = new DataGridViewButtonColumn();
            this.column4.UseColumnTextForButtonValue = true;
            this.column4.Text = "ボタン";

            this.dataGridView1.Columns.AddRange(
                new DataGridViewColumn[] { this.column1, 
                                           this.column2, 
                                           this.column3, 
                                           this.column4 });

            this.column1.DataPropertyName = "Name";
            this.column1.HeaderText = "名前";

            this.column2.DataPropertyName = "Age";
            this.column2.HeaderText = "年齢";

            this.column3.DataPropertyName = "Address";
            this.column3.HeaderText = "住所";

            this.column4.HeaderText = "詳細情報";

            this.dataGridView1.DataSource = this.bindingSource1;
        }

        private void Form5_Load(object sender, EventArgs e)
        {            
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var list = new List<UserInfo>
            {
                new UserInfo{ Name="Mike", Age=25, Address="Maryland" },
                new UserInfo{ Name="John", Age=30, Address="Virginia" },
                new UserInfo{ Name="Tom", Age=23, Address="West Virginia" }
            };

            this.bindingSource1.DataSource = list;
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            int index = e.RowIndex;
            // 押下された行の各項目を別のテキストボックスに書き出す
        }
    }

    public class UserInfo
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Address { get; set; }
    }
}

引用返信 編集キー/
■99928 / inTopicNo.9)  Re[3]: vb.net datagridiew内にボタンを配置したい
□投稿者/ furu (160回)-(2022/06/21(Tue) 19:21:48)
No99924 (ゆい さん) に返信
> 上記コードのようにifで判定するコードを入れてみたのですが、
> 検索ボタンを一度だけ押すと正常に動作するのですが、
> 検索ボタンを二回連続で押すと、
> 隣の列がボタンに変化してしまいます
失礼しました。

では、ユーザ情報が出力前にボタン列があったら
ボタン列を削除してはどうでしょうか?
(検索ボタンクリック時イベントも削除)
引用返信 編集キー/
■99929 / inTopicNo.10)  Re[1]: vb.net datagridiew内にボタンを配置したい
□投稿者/ 魔界の仮面弁士 (3409回)-(2022/06/21(Tue) 21:02:52)
No99920 (ゆい さん) に返信
> dgUserList.Columns.Add(colBtn)
> 上記のコードを検索ボタンクリック時イベントに入れたとき、検索ボタンを二回押下した際に、ユーザ情報のカラムまで
> ボタンに浸食されてしまったため、上記コードを入れる位置を変更したらいいのではないかと考えているんですが、

dgUserList というのが、DataGridView でしょうか。
「ボタンに浸食」という状況がいまひとつ分からないのですが、
『検索ボタンを押す』処理の中で、毎回「表示ボタン」列を追加しているということですか?

他の方の投稿にもあるように、検索ボタンを押す前から、
表示ボタン列を先に用意しておけばよいと思うのですが、状況が良く分からない…。


仮に DataSource が変更されたとしても、
デザイン時に事前に登録しておいた検索ボタン列は消えませんでした。
 DataGridView1.AutoGenerateColumns = True
 DataGridView1.DataSource = Nothing

列の位置が問題だというのなら、列が確定してから、その後で順番を入れ替えても良いかと。
 colButton.DisplayIndex = DataGridView1.Columns.Count - 1


No99924 (ゆい さん) に返信
> 検索ボタンを一度だけ押すと正常に動作するのですが、
> 検索ボタンを二回連続で押すと、
> 隣の列がボタンに変化してしまいます

何の隣の列でしょうか?

何故動的に追加しているのかという状況も把握できていないのですが、
二回押すのがすべて駄目だというわけではなく、短い時間に
二回連続で押すのが問題という意味でしょうか? その場合は、
二度押し防止のための仕組みを追加する必要があるかもしれません。

https://social.msdn.microsoft.com/Forums/ja-JP/ac888f05-b215-4604-9e0e-9bf5a843ce13/vb2005-1250812479125312010824230252761237538450274902604127861?forum=vbgeneralja
引用返信 編集キー/
■99930 / inTopicNo.11)  Re[2]: vb.net datagridiew内にボタンを配置したい
□投稿者/ ゆい (63回)-(2022/06/22(Wed) 16:14:29)
回答ありがとうございます。

言葉足らずで申し訳ありません。

はい、dgUserList が、DataGridView です。
状況としては、一度ボタンを押したときは、
ユーザ情報が正常に出力され、

Code|Id|Password |ボタン
1234|01|000000  | □
のように表示されるのですが、
二回続けて押すと、
Code|Id|Password |
1234|01| □   |

のように、Passwordの中身がボタンに切り替わり、ボタンのカラムが消失していました。


ありがとうございます。
試してみます。

ボタンを押すタイミングはおそらく関係ないと思われます。
(時間をおいてから二度目を押しても同じ状況になったため。)


No99929 (魔界の仮面弁士 さん) に返信
> ■No99920 (ゆい さん) に返信
>>dgUserList.Columns.Add(colBtn)
>>上記のコードを検索ボタンクリック時イベントに入れたとき、検索ボタンを二回押下した際に、ユーザ情報のカラムまで
>>ボタンに浸食されてしまったため、上記コードを入れる位置を変更したらいいのではないかと考えているんですが、
>
> dgUserList というのが、DataGridView でしょうか。
> 「ボタンに浸食」という状況がいまひとつ分からないのですが、
> 『検索ボタンを押す』処理の中で、毎回「表示ボタン」列を追加しているということですか?
>
> 他の方の投稿にもあるように、検索ボタンを押す前から、
> 表示ボタン列を先に用意しておけばよいと思うのですが、状況が良く分からない…。
>
>
> 仮に DataSource が変更されたとしても、
> デザイン時に事前に登録しておいた検索ボタン列は消えませんでした。
>  DataGridView1.AutoGenerateColumns = True
>  DataGridView1.DataSource = Nothing
>
> 列の位置が問題だというのなら、列が確定してから、その後で順番を入れ替えても良いかと。
>  colButton.DisplayIndex = DataGridView1.Columns.Count - 1
>
>
> ■No99924 (ゆい さん) に返信
>>検索ボタンを一度だけ押すと正常に動作するのですが、
>>検索ボタンを二回連続で押すと、
>>隣の列がボタンに変化してしまいます
>
> 何の隣の列でしょうか?
>
> 何故動的に追加しているのかという状況も把握できていないのですが、
> 二回押すのがすべて駄目だというわけではなく、短い時間に
> 二回連続で押すのが問題という意味でしょうか? その場合は、
> 二度押し防止のための仕組みを追加する必要があるかもしれません。
>
> https://social.msdn.microsoft.com/Forums/ja-JP/ac888f05-b215-4604-9e0e-9bf5a843ce13/vb2005-1250812479125312010824230252761237538450274902604127861?forum=vbgeneralja
引用返信 編集キー/
■99931 / inTopicNo.12)  Re[3]: vb.net datagridiew内にボタンを配置したい
□投稿者/ 魔界の仮面弁士 (3410回)-(2022/06/22(Wed) 16:41:27)
No99930 (ゆい さん) に返信
> はい、dgUserList が、DataGridView です。
> 状況としては、一度ボタンを押したときは、
> ユーザ情報が正常に出力され、

ということは、ボタン列の追加といった話以前に、
検索ボタンの中に「ユーザー情報を出力するためのコード」もあるわけですよね。


その部分は、どういう実装になっているのでしょうか?
 DataGridView1.DataSouce = 新しいDataTable
のような実装になっているのか、あるいは DataSource は変更せずに、
バインドした DataTable の中身を書き換えるだけの処理なのか、
それとも BindingSource を通じて差し替えているのか。

あるいは DataSouce とかを連携せず、
 DataGridView(1, 2).Value = "xyz"
のように、各セルに直接値を書き込んでいるのか…。
引用返信 編集キー/
■99938 / inTopicNo.13)  Re[3]: vb.net datagridiew内にボタンを配置したい
□投稿者/ 大谷刑部 (197回)-(2022/06/23(Thu) 11:33:39)
No99930 (ゆい さん) に返信
> 状況としては、一度ボタンを押したときは、
> ユーザ情報が正常に出力され、
>
> Code|Id|Password |ボタン
> 1234|01|000000  | □
> のように表示されるのですが、
> 二回続けて押すと、
> Code|Id|Password |
> 1234|01| □   |
>
> のように、Passwordの中身がボタンに切り替わり、ボタンのカラムが消失していました。
>

というような状況が考えにくいのですが。
仮に、パスワードカラムの値が何らかの事情で消失(あるいはNullになる)したとしても、グリッドとデータソースがバインドしてる限りは勝手に、列が削除されるようなことはあり得ません。
問題はボタンカラムの追加のコードではなく、ユーザー情報の出力の方のロジックではありませんか?


引用返信 編集キー/
■99939 / inTopicNo.14)  Re[4]: vb.net datagridiew内にボタンを配置したい
□投稿者/ 大谷刑部 (198回)-(2022/06/23(Thu) 11:36:23)
No99931 (魔界の仮面弁士 さん) に返信
> ■No99930 (ゆい さん) に返信
>>はい、dgUserList が、DataGridView です。
>>状況としては、一度ボタンを押したときは、
>>ユーザ情報が正常に出力され、
>
> ということは、ボタン列の追加といった話以前に、
> 検索ボタンの中に「ユーザー情報を出力するためのコード」もあるわけですよね。
>
>
> その部分は、どういう実装になっているのでしょうか?
>  DataGridView1.DataSouce = 新しいDataTable
> のような実装になっているのか、あるいは DataSource は変更せずに、
> バインドした DataTable の中身を書き換えるだけの処理なのか、
> それとも BindingSource を通じて差し替えているのか。
>
> あるいは DataSouce とかを連携せず、
>  DataGridView(1, 2).Value = "xyz"
> のように、各セルに直接値を書き込んでいるのか…。

なんかご指摘の通り、データをバインドせず書き込んでるが、そのロジックにバグがある可能性が高いような気はしますね。
バインドして列が勝手に削除されるとかまああり得ないと思うので。
引用返信 編集キー/
■99940 / inTopicNo.15)  Re[1]: vb.net datagridiew内にボタンを配置したい
□投稿者/ WebSurfer (2498回)-(2022/06/23(Thu) 11:54:47)
No99920 (ゆい さん) に返信

レスをもらったらフィードバックを返しませんか?

自分は No99925No99927 で提案してますが、役に立った/立たなかったぐらいは返せる
のでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出せるかも。
とにかく無言でスルーは NG です。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ