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

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

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

コンボボックスによる絞り込み

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

■91943 / inTopicNo.1)  コンボボックスによる絞り込み
  
□投稿者/ たかし (3回)-(2019/08/12(Mon) 18:23:34)

分類:[.NET 全般] 

たかしです。いつもお世話になっております。

tbl_部署
・部署コード
・部署名

tbl_社員
・社員コード
・社員名
・部署コード

の2つのテーブルがありフォーム上にはComboBox1ととComboBox2があります。
やりたいことは、ComboBox1でまず部署コードを選択します。
するとComboBox2のドロップダウンリストにComboBox1で選択した部署の社員だけが表示されるようにすることです。
良い方法はないでしょうか?

引用返信 編集キー/
■91945 / inTopicNo.2)  Re[1]: コンボボックスによる絞り込み
□投稿者/ 魔界の仮面弁士 (2301回)-(2019/08/12(Mon) 23:30:27)
No91943 (たかし さん) に返信
> の2つのテーブルがありフォーム上にはComboBox1ととComboBox2があります。

Windows Forms アプリケーションを作成していて、
tbl_部署というのは DataTable の事で良いでしょうか。

言語指定が無かったですが、comboBox1 ではなく ComboBox1 と書かれていたので、
とりあえず Visual Basic と仮定して書いてみます。


Public Class Form1
  Private ds As DataSet
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ds = CreateSample()

    ds.Relations.Add("rel_部署_社員",
             ds.Tables("tbl_部署").Columns("部署コード"),
             ds.Tables("tbl_社員").Columns("部署コード"))

    Me.BindingSource1.DataSource = ds
    Me.BindingSource1.DataMember = "tbl_部署"

    Me.BindingSource2.DataSource = Me.BindingSource1
    Me.BindingSource2.DataMember = "rel_部署_社員"

    ComboBox1.DataSource = Me.BindingSource1
    ComboBox1.ValueMember = "部署コード"
    ComboBox1.DisplayMember = "部署名"
    ComboBox2.DataSource = Me.BindingSource2
    ComboBox2.ValueMember = "社員コード"
    ComboBox2.DisplayMember = "社員名"
  End Sub

  Private Function CreateSample() As DataSet
    Dim ds As New DataSet("Sample") With {.CaseSensitive = True}
    Dim tbl1 As DataTable = ds.Tables.Add("tbl_部署")
    Dim tbl2 As DataTable = ds.Tables.Add("tbl_社員")

    tbl1.Columns.Add("部署コード", GetType(Decimal)).AllowDBNull = False
    tbl1.Columns.Add("部署名", GetType(String)).AllowDBNull = False
    tbl1.PrimaryKey = New DataColumn() {tbl1.Columns("部署コード")}

    tbl2.Columns.Add("社員コード", GetType(String)).AllowDBNull = False
    tbl2.Columns.Add("社員名", GetType(String)).AllowDBNull = False
    tbl2.Columns.Add("部署コード", GetType(Decimal)).AllowDBNull = True
    tbl2.PrimaryKey = New DataColumn() {tbl2.Columns("社員コード")}

    tbl1.Rows.Add(10000D, "総務部")
    tbl1.Rows.Add(10020D, "総務部総務課")
    tbl1.Rows.Add(12000D, "営業部")
    tbl1.Rows.Add(12010D, "営業部営業一課")

    tbl2.Rows.Add("AX0020", "金田 一太郎", 10000D)
    tbl2.Rows.Add("BY0112", "今西 欣治", 10020D)
    tbl2.Rows.Add("DX0987", "有馬 貴臣", 10020D)
    tbl2.Rows.Add("DX1024", "山口 六平太", 10020D)
    tbl2.Rows.Add("PN0132", "緒方 賢太", 12000D)
    tbl2.Rows.Add("PC1024", "片岡 孝夫", 12010D)
    tbl2.Rows.Add("PC2048", "久米 広明", 12010D)

    ds.AcceptChanges()
    Return ds
  End Function
End Class
引用返信 編集キー/
■91972 / inTopicNo.3)  Re[2]: コンボボックスによる絞り込み
□投稿者/ たかし (4回)-(2019/08/15(Thu) 15:44:43)
No91945 (魔界の仮面弁士 さん) に返信
> ■No91943 (たかし さん) に返信
>>の2つのテーブルがありフォーム上にはComboBox1ととComboBox2があります。
> 
> Windows Forms アプリケーションを作成していて、
> tbl_部署というのは DataTable の事で良いでしょうか。
> 
> 言語指定が無かったですが、comboBox1 ではなく ComboBox1 と書かれていたので、
> とりあえず Visual Basic と仮定して書いてみます。
> 
> 
> Public Class Form1
>   Private ds As DataSet
>   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
>     ds = CreateSample()
> 
>     ds.Relations.Add("rel_部署_社員",
>              ds.Tables("tbl_部署").Columns("部署コード"),
>              ds.Tables("tbl_社員").Columns("部署コード"))
> 
>     Me.BindingSource1.DataSource = ds
>     Me.BindingSource1.DataMember = "tbl_部署"
> 
>     Me.BindingSource2.DataSource = Me.BindingSource1
>     Me.BindingSource2.DataMember = "rel_部署_社員"
> 
>     ComboBox1.DataSource = Me.BindingSource1
>     ComboBox1.ValueMember = "部署コード"
>     ComboBox1.DisplayMember = "部署名"
>     ComboBox2.DataSource = Me.BindingSource2
>     ComboBox2.ValueMember = "社員コード"
>     ComboBox2.DisplayMember = "社員名"
>   End Sub
> 
>   Private Function CreateSample() As DataSet
>     Dim ds As New DataSet("Sample") With {.CaseSensitive = True}
>     Dim tbl1 As DataTable = ds.Tables.Add("tbl_部署")
>     Dim tbl2 As DataTable = ds.Tables.Add("tbl_社員")
> 
>     tbl1.Columns.Add("部署コード", GetType(Decimal)).AllowDBNull = False
>     tbl1.Columns.Add("部署名", GetType(String)).AllowDBNull = False
>     tbl1.PrimaryKey = New DataColumn() {tbl1.Columns("部署コード")}
> 
>     tbl2.Columns.Add("社員コード", GetType(String)).AllowDBNull = False
>     tbl2.Columns.Add("社員名", GetType(String)).AllowDBNull = False
>     tbl2.Columns.Add("部署コード", GetType(Decimal)).AllowDBNull = True
>     tbl2.PrimaryKey = New DataColumn() {tbl2.Columns("社員コード")}
> 
>     tbl1.Rows.Add(10000D, "総務部")
>     tbl1.Rows.Add(10020D, "総務部総務課")
>     tbl1.Rows.Add(12000D, "営業部")
>     tbl1.Rows.Add(12010D, "営業部営業一課")
> 
>     tbl2.Rows.Add("AX0020", "金田 一太郎", 10000D)
>     tbl2.Rows.Add("BY0112", "今西 欣治", 10020D)
>     tbl2.Rows.Add("DX0987", "有馬 貴臣", 10020D)
>     tbl2.Rows.Add("DX1024", "山口 六平太", 10020D)
>     tbl2.Rows.Add("PN0132", "緒方 賢太", 12000D)
>     tbl2.Rows.Add("PC1024", "片岡 孝夫", 12010D)
>     tbl2.Rows.Add("PC2048", "久米 広明", 12010D)
> 
>     ds.AcceptChanges()
>     Return ds
>   End Function
> End Class


魔界の仮面弁士さま、お世話になります。
ご返事が遅くなり申し訳ありません。
先日お忙しい中、わざわざご提示いただいたコードにて絞り込み検索はできました。
どうもありがとうございます。

申し訳ないのですが、もう少し質問をさせてください。
実は弊社の従業員は650人程おりまして部署の数も十数ほどあります。
退職者や新入社員、また部署の異動なども頻繁に行なわれます。
このようなことに対応するために、コード内の追加ではなく、
ListRow(VBにはないようですが)を、テーブルあるいはビューから持ってくることは出来ないものでしょうか?
ストアドプロシージャも試しましたが、WindowsFormからのパラメータ操作の仕方が難しすぎて分かりません。
何よりExcelやAccessでは簡単に実現出来るこれらの機能の説明が、
そもそもVB.NETではウェブのどこを探しても出てきません(私の探し方が悪いのかもしれませんが)。
そのようなわけでもしかしてこれは不可能なのではと思い始めています。

実はDataGridViewで目的に近いものが作成できることが分かったところなのですが、
当初の目論見通りふたつのComboBoxだけで実行する方法が何とも諦めきれません。
どうかもう少しお知恵をお借りできないでしょうか?
よろしくお願いいたします。たかし

引用返信 編集キー/
■91973 / inTopicNo.4)  Re[3]: コンボボックスによる絞り込み
□投稿者/ 魔界の仮面弁士 (2305回)-(2019/08/15(Thu) 16:45:22)
No91972 (たかし さん) に返信
> ListRow(VBにはないようですが)を、テーブルあるいはビューから持ってくることは出来ないものでしょうか?

それでも良いですよ。

DataTable に格納するデータは、手動で登録したデータだけではなく、
DataAdapter 等を用いて、データベースに問い合わせて取得したデータでも構いません。

VB にとってみれば、DataTable にデータが保持されているという点が重要なのであって、
その元データがどこから来たものであるのかは、特に問われません。



> 実は弊社の従業員は650人程おりまして部署の数も十数ほどあります。

それは在籍者の人数でしょうか。
ComboBox に全部署の人数を表示するとなると、探すだけでも手間なので、
部署で絞り込んでから表示できた方が良いのでしょうね。


で…退職者も含めるとすると、データ件数としては数千件規模でしょうか?
その程度なら、DataTable に全件ロードしておいても問題無いと思います。
画面上に全部を表示することはなく、その中の一部だけが絞り込まれるのであれば。


> 退職者や新入社員、また部署の異動なども頻繁に行なわれます。

退職者(過去データ)や入社予定者(未来データ)も出力するとしたら、
部署の統合・分割・廃止・名称変更については、どのように表現されるのでしょうか?


> ストアドプロシージャも試しましたが、WindowsFormからのパラメータ操作の仕方が難しすぎて分かりません。
どのデータベース製品を使っていて、どういうストアドを作ってみたのかが分からないので、
具体的なサンプルは提示できません。(^^;



それと、データベースからデータを取得する際の「タイミング」と「取得範囲」も考えておきましょう。

【タイミング】
Form_Load 時?
Button_Click 時?
ComboBox_SelectedIndexChanged 時?

【取得範囲】
在籍している全社員を問い合わせる?
退職者や未来入社も含めた全社員を問い合わせる?
指定した部署の社員のみで良い?


(案1) Load 時に、部署と社員情報を、すべてを事前に読み取っておく。
 結果としては No91945 とほぼ同じ処理になる。

(案2) Load 時には部署だけ読み取っておき、ComboBox1 を操作するたびに、
 ComboBox2 用の社員データを、毎回データベースに問い合わせるようにする。

(案3) 案2 に近いが、毎回データベースに問い合わせるのではなく、
 一度読み取った部署のデータは、前回の取得結果を使うようにする。
引用返信 編集キー/
■91974 / inTopicNo.5)  Re[3]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1872回)-(2019/08/15(Thu) 16:48:42)
No91972 (たかし さん) に返信

最初の質問に書いてあった tbl_部署, tbl_社員 は SQL Server などのデータベースにある
テーブルで、それからデータを取得して連動 ComboBox に表示したいと言ってます?

引用返信 編集キー/
■91988 / inTopicNo.6)  Re[4]: コンボボックスによる絞り込み
□投稿者/ たかし (5回)-(2019/08/16(Fri) 09:06:35)
魔界の仮面弁士さま、 WebSurferさま、お世話様です。

>最初の質問に書いてあった tbl_部署, tbl_社員 は SQL Server などのデータベースにある
>テーブルで、それからデータを取得して連動 ComboBox に表示したいと言ってます?

いかにもSQLサーバーです。そしてストアドプロシージャは以下のとおりです。

-----------------------------------------------------------------------------

ALTER PROCEDURE [dbo].[std_社員] 
	-- Add the parameters for the stored procedure here
	@部署コード int 
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT * FROM dbo.qry_社員 
	WHERE 部署コード = @部署コード
END

-----------------------------------------------------------------------------

>退職者(過去データ)や入社予定者(未来データ)も出力するとしたら、
>部署の統合・分割・廃止・名称変更については、どのように表現されるのでしょうか?

そうなんです。そこが問題でまだ解決していないのです。
とりあえず在職者のデータだけを入力しています。
おそらく部署の履歴を取ることも必要になると思いますが、それはまだ先の課題となります。
現時点では上書き変更で対処しようと思っております。
Accessのサブフォームのような機能がVBにもあるとよいのですが。

>それと、データベースからデータを取得する際の「タイミング」と「取得範囲」も考えておきましょう。

流れとしてはComboBox1で部署を選択し、ComboBox2で社員を選択、
そして社員に関するすべてのデータを呼び出すという感じを考えています。
絞り込むタイミングとしてはComboBox2のMouseDownイベントがいいのではないかと。
データを呼び出すタイミングはComboBox.SelectedIndexChanged イベントないしは
CommandButtonクリックイベントです。

ではよろしくお願いいたします。

引用返信 編集キー/
■91989 / inTopicNo.7)  Re[5]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1873回)-(2019/08/16(Fri) 10:15:34)
No91988 (たかし さん) に返信

最終的にどうしたいのですか? No91972 に書いてあった、

> 実はDataGridViewで目的に近いものが作成できることが分かったところなのですが、
> 当初の目論見通りふたつのComboBoxだけで実行する方法が何とも諦めきれません。

というところから想像すると、最終的にやりたいことは部署を ComboBox から選択すると、
その部署に属する社員のデータ一覧が DataGridView に表示されるということではないか
と思ってますが?

であれば、最初の質問の ComboBox 2つでの実装を追求するより、上記のことを考えた方
がよさそうだと思うのですが。

あと、No91973 で魔界の仮面弁士さんからも質問されていますが、事前に SQL Server から
全ての情報を DataTable に読み取ってからそれを操作するのか、操作の都度 SQL Server
からデータを DataTable に読み取ってから操作したいのか、それともその間を取って
部署の方は前者で社員の方は後者としたいのですか?
引用返信 編集キー/
■91990 / inTopicNo.8)  Re[5]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1874回)-(2019/08/16(Fri) 10:21:25)
No91988 (たかし さん) に返信

上の No91989 で質問した「最終的にどうしたいのですか?」ですが、以下の記事の図
のような感じのことがしたいのでしょうか?(記事は ASP.NET Web Forms アプリの話
ですが図だけ見てください)

DropDownList を使って絞込み
http://surferonwww.info/BlogEngine/post/2011/07/17/Showing-records-selected-by-DropDownLists-into-GridView.aspx
引用返信 編集キー/
■91991 / inTopicNo.9)  Re[5]: コンボボックスによる絞り込み
□投稿者/ 魔界の仮面弁士 (2307回)-(2019/08/16(Fri) 10:24:30)
2019/08/16(Fri) 11:16:45 編集(投稿者)

No91988 (たかし さん) に返信
> >退職者(過去データ)や入社予定者(未来データ)も出力するとしたら、
> >部署の統合・分割・廃止・名称変更については、どのように表現されるのでしょうか?
> そうなんです。そこが問題でまだ解決していないのです。

一例として:

たとえば、部署マスタが年度単位で刷新されるような場合、
「対象年度」を入れる入力欄を設けておき(既定値は今年度)、
その年度分の部署一覧を ComboBox1 にロードするような設計にすることがあります。

年度途中での入れ替わりがある場合や、
部署間の人事異動や、退職後の再任用も追跡するようなケースでは、
「対象年月日」を範囲指定する設計にする事もあります。


> Accessのサブフォームのような機能がVBにもあるとよいのですが。
WinForm だと DataRepeater コントロールぐらいですかね。
WPF とか ASP.NET だと、もう少しやりようがありそうですが。

https://blogs.msdn.microsoft.com/vbteamjp/2008/06/06/data-repeater-power-packs-beth-massi/
https://blogs.yahoo.co.jp/yss2216/6161472.html


>> データベースからデータを取得する際の「タイミング」と「取得範囲」も考えておきましょう。
> 流れとしてはComboBox1で部署を選択し、ComboBox2で社員を選択、
> そして社員に関するすべてのデータを呼び出すという感じを考えています。

選択した社員の情報を読み込むのは、Button1_Click あたりに置いといて、
コンボボックスの選択値で読み込めば良いだけなので、そう難しくは無いはず。

問題視しているのはその前。
ComboBox1 に表示するための部署データ群や、
ComboBox2 に表示するための社員データ群を取得する際の話です。


『異動情報が頻繁に更新される』との事でしたので、
SQL Server から、部署名や社員名の一覧を SELECT で読み込むのが、
「どのイベント」で「どの範囲(WHERE条件)」を読み込んでくるのかを
考えておくべきなのかな、と。


Form1_Load 時に全件ロードしておく方法だと、
サーバー側が変更(新規採用、死亡退職、苗字変更、配置部署確定)されても、
ComboBox に表示される情報は、Load 時点のキャッシュデータのままです。

かといって、ComboBox がドロップダウンされた瞬間に データを取り出して
その ComboBox にアイテムを追加する方法では、タイミング的に間に合わないですし。

ComboBox の一覧を再読み込みするためのリロードボタンを用意するという手もありますが、
いずれにせよ、アプリケーション要件次第で変わってきますね。


> 絞り込むタイミングとしてはComboBox2のMouseDownイベントがいいのではないかと。

MouseDown が発生するとは限りませんので、それを前提として
設計するのは避けたほうが良いでしょう。

たとえば、Tab キーによってフォーカス移動してくることもありますよね。
ComboBox がアクティブになっている状態から、
ドロップダウンさせないまま、上下矢印キーで項目が変更されたり、
アイテム名の頭文字を入力して候補を選択したり、
[F4] キーあるいは、[Alt]+[下]キーでドロップダウンされることもあります。


> データを呼び出すタイミングはComboBox.SelectedIndexChanged イベントないしは
> CommandButtonクリックイベントです。

VBA や VB6 などでは CommandButton と呼ばれていましたが、
VB.NET においては、ただの Button です。


SelectedIndxChanged や SelectionChangeCommitted は、
上下キーやマウスホイールなどによる操作により
何度も高速に呼ばれることがある点を考慮しておいてください。


No91945 で ComboBox1 の切り替えで ComboBox2 の内容を入れ替えたときのように、
既に DataSet に取得済みデータ内からの絞込みぐらいなら何とかなるでしょうけれども、
SQL Server からの随時読み込みを SelectedIndexChanged のタイミングで行うというのは、
パフォーマンス上の問題が生じます。


なので個人的には、ComboBox2_SelectedIndexChanged では、
画面上の社員情報の表示をクリアするだけに留めておき、
Button1_Click で ComboBox2.SelectedValue を SQL Server に渡して、
社員情報を読み込みさせる方法を提案しておきます。
ボタンがあると、同じ条件で「再読み込み」する場合にも便利ですし。
引用返信 編集キー/
■91999 / inTopicNo.10)  Re[5]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1877回)-(2019/08/16(Fri) 12:20:52)
No91988 (たかし さん) に返信

違うかもしれませんが、

(1) 部署を ComboBox から選択すると、その部署に属する社員のデータ一覧が DataGridView に表示
(2) 事前に SQL Server から全ての情報を DataTable に読み取ってからそれを操作する

ということで案を紹介しておきます。

DataGridView に「tbl_社員」テーブルの全レコードの一覧を表示するところまでは Visual Studio
のデーターソース構成ウィザードを使えば簡単にできます。(表示だけでなく編集・更新も可能です
がそれはちょっと置いといて・・・)

以下のチュートリアル、

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter
を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分
でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://docs.microsoft.com/ja-jp/previous-versions/wxt2cwcc(v=vs.120)

上に紹介したチュートリアルは 2 つのテーブルを階層更新するために少々複雑になっていますが、単一
テーブルですともっと簡単で、自分では一行もコードを書かなくても 5 分もかからずアプリを作れるは
ずです。

そこまで出来たら、以下の Teratail のスレッドの SurferOnWww の回答のように、DataTable から
DataView を取得して、その RowFilter プロパティに条件を設定します。

TableAdapterのSELECT文を参照したい
https://teratail.com/questions/163335

【VS C#】Textboxから取得したstringで検索クエリ
https://teratail.com/questions/157732

上の記事では TextBox を使っていますが、それを ComboBox に変えれば望むことができると思います、

引用返信 編集キー/
■92001 / inTopicNo.11)  Re[6]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1878回)-(2019/08/16(Fri) 12:40:02)
紹介したチュートリアル、

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

の Customers テーブルを tbl_部署に、Orders テーブルを tbl_社員に読み替えて
チュートリアルと同様な形のアプリにするというのも検討の価値があると思います。
引用返信 編集キー/
■92005 / inTopicNo.12)  Re[7]: コンボボックスによる絞り込み
□投稿者/ たかし (6回)-(2019/08/16(Fri) 19:30:59)
まずは魔界の仮面弁士さま、 WebSurferさま、
お付き合いいただいてどうもありがとうございました。
お二人からご紹介のあったサイトはゆっくり読んで勉強させていただきます。
やはりVB.NETで「コンボボックスによる絞り込み」は出来ないか、
少なくとも「途方もなく難しい」ということが分かりました。
ウエブを探しても記事がないというのがその何よりの証拠だと思います。

>> 絞り込むタイミングとしてはComboBox2のMouseDownイベントがいいのではないかと。

>MouseDown が発生するとは限りませんので、それを前提として
>設計するのは避けたほうが良いでしょう。

>たとえば、Tab キーによってフォーカス移動してくることもありますよね。
>ComboBox がアクティブになっている状態から、
>ドロップダウンさせないまま、上下矢印キーで項目が変更されたり、
>アイテム名の頭文字を入力して候補を選択したり、
>[F4] キーあるいは、[Alt]+[下]キーでドロップダウンされることもあります。

なるほど。ドロップダウンボタンがあれば、普通の人ならば必ず押すものだと思っていましたが、
確かに上級者の場合、マウスなしでTabKeyを使うことが多いかも知れませんね。
となるとやはりComboBox2_Enterイベントでしょうかね?

最後に「次善の策」として考えていたDataGridViewを使うのが手っ取り早いと理解いたしました。
拙作のコードを書いて、お二人へのお礼とさせていただきたいと思います。
フォームにTabPageを2つ作り1ページ目に部署コードComboBox、.部署名TextBox、社員コードComboBox、
社員名TextBoxを置きます。
2ページ目にStd_社員DataGridViewとTbl_部署DataGridViewを置いて、
それぞれにToolStripを付けました。以下がそのコードです。

Public Class 社員情報

    Private Sub 社員情報_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Tbl_部署TableAdapter.Fill(Me.ComboBoxSampleDataSet.tbl_部署)
        Me.Qry_社員TableAdapter.Fill(Me.ComboBoxSampleDataSet.qry_社員)
        Me.部署コードComboBox.Text = ""
        Me.部署名TextBox.Text = ""
        Me.社員コードComboBox.Text = ""
        Me.社員名TextBox.Text = ""
    End Sub

    Private Sub 部署コードComboBox_TextChanged(sender As Object, e As EventArgs) Handles 部署コードComboBox.TextChanged
        部署コードToolStripTextBox.Text = Me.部署コードComboBox.Text
        Try
            Me.Std_社員TableAdapter.Fill(Me.ComboBoxSampleDataSet.std_社員, New System.Nullable(Of Integer)(CType(社員コードToolStripTextBox.Text, Integer)))
        Catch ex As System.Exception
        End Try
    End Sub

    Private Sub 社員コードComboBox_Enter(sender As Object, e As EventArgs) Handles 社員コードComboBox.Enter
        If Me.部署コードComboBox.Text = "" Then
            Me.社員名TextBox.Text = ""
            MsgBox("部門コードを入力してください。")
            Me.部署コードComboBox.Select()
        Else
            Me.TabPage.SelectedIndex = 1
            Me.Std_社員DataGridView.Visible = True
        End If
    End Sub

   '*********************************************************************************************** 
   'タブインデックスを選択したときのイベント
   '***********************************************************************************************

    Private Sub TabTest_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage.SelectedIndexChanged
        Select Case Me.TabPage.SelectedIndex'タブを選択した時のイベント
            Case 0
            Case 1
                If Me.部署コードComboBox.Text = "" Then
                    Me.Std_社員DataGridView.Visible = False
                    Me.社員コードToolStripTextBox.Text = Me.社員コードComboBox.Text
                    Me.社員名ToolStripTextBox.Text = Me.社員名TextBox.Text
                Else
                    Me.Std_社員DataGridView.Visible = True
                    Try
                        Me.Std_社員TableAdapter.Fill(Me.ComboBoxSampleDataSet.std_社員, New System.Nullable(Of Integer)(CType(部署コードToolStripTextBox.Text, Integer)))
                    Catch ex As System.Exception
                        'System.Windows.Forms.MessageBox.Show(ex.Message)'メッセージは出さない
                    End Try
                End If
                If Me.社員コードComboBox.Text = "" Then
                    Me.Std_社員DataGridView.Visible = False
                End If
                Me.部署コードToolStripTextBox.Text = Me.部署コードComboBox.Text
                Me.部署名ToolStripTextBox.Text = Me.部署名TextBox.Text
                Me.社員コードToolStripTextBox.Text = Me.社員コードComboBox.Text
                Me.社員名ToolStripTextBox.Text = Me.社員名TextBox.Text
            Case 2
        End Select
    End Sub

    Private Sub Std_社員DataGridView_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles Std_社員DataGridView.CellDoubleClick
        Dim r As DataGridViewRow = Me.Std_社員DataGridView.CurrentRow
        Me.社員コードComboBox.Text = r.Cells("DataGridViewTextBoxColumn8").Value
        MsgBox("入力しました。")
        Me.TabPage.SelectedIndex = 0
    End Sub

    Private Sub クリアButton_Click(sender As Object, e As EventArgs) Handles クリアButton.Click
        Me.部署コードComboBox.Text = ""
        Me.部署名TextBox.Text = ""
        Me.社員コードComboBox.Text = ""
        Me.社員名TextBox.Text = ""
    End Sub

End Class


引用返信 編集キー/
■92006 / inTopicNo.13)  Re[8]: コンボボックスによる絞り込み
□投稿者/ たかし (7回)-(2019/08/17(Sat) 08:04:21)
追加質問です。
魔界の仮面弁士さま、ご紹介に預かったDataRepeaterコントロールをさっそく試してみようと思い、
https://blogs.msdn.microsoft.com/vbteamjp/2008/06/06/data-repeater-power-packs-beth-massi/
より「VisualBasicPowerPacks3Setup」というものをダウンロードしてインストールしてみました。
すると「すべてのプログラム」の中に「Microsoft Visual Basic 2005 Power Packs」というフォルダが出来ました。
これを呼び出して使ってみようと思い、VisualStudio2017を開いてみましたが、ツールボックスの中に
「DataRepeaterコントロール」とおぼしきものが見当たりません。
このコントロールは、どうやって呼び出すのでしょうか?
ご教示願います。

引用返信 編集キー/
■92007 / inTopicNo.14)  Re[8]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1879回)-(2019/08/17(Sat) 10:43:48)
No92005 (たかし さん) に返信

> やはりVB.NETで「コンボボックスによる絞り込み」は出来ないか、
> 少なくとも「途方もなく難しい」ということが分かりました。

そんなことはなくて、No91999 に書いたように、

(2) 事前に SQL Server から全ての情報を DataTable に読み取ってからそれを操作する

という条件でよければ、DataTable から DataView を取得して、その RowFilter プロパ
ティに条件を設定すればできます。

それはともかく、No91989 No91990 No91999 No92001 と私からレスしていますが、それら
に対するフィードバックは無しですか?

読んだ・読まなかった、理解できた・できなかった、役に立った・立たなかったぐらいは
フィードバックとして返してもらっても良いと思うのですけど。
引用返信 編集キー/
■92018 / inTopicNo.15)  Re[9]: コンボボックスによる絞り込み
□投稿者/ たかし (8回)-(2019/08/18(Sun) 09:13:00)
WebSurferさま、大変に失礼しました。

>読んだ・読まなかった、理解できた・できなかった、役に立った・立たなかったぐらいは
>フィードバックとして返してもらっても良いと思うのですけど。

ご紹介いただいた記事はすべて読ませていただきました。
ただ私自身VB.NET歴がまだ浅いもので、完全に理解することは出来ておりません。
また、記事によっては私の開発環境であるVisualStudio2017の画面構成と違うものがあり、
なかなか一筋縄では行かないというのが本音です。

No91989
>あと、No91973 で魔界の仮面弁士さんからも質問されていますが、事前に SQL Server から
>全ての情報を DataTable に読み取ってからそれを操作するのか、操作の都度 SQL Server
>からデータを DataTable に読み取ってから操作したいのか、それともその間を取って
>部署の方は前者で社員の方は後者としたいのですか?

これは具体的に言うとどのようなことを指しているのでしょうか?
もう少し詳しくお教え願えないでしょうか?

No91990
>上の No91989 で質問した「最終的にどうしたいのですか?」ですが、以下の記事の図
>のような感じのことがしたいのでしょうか?(記事は ASP.NET Web Forms アプリの話
>ですが図だけ見てください)
>
>DropDownList を使って絞込み
>http://surferonwww.info/BlogEngine/post/2011/07/17/Showing-records-selected-by-DropDownLists-into-GridView.aspx

私のしたいことは、これとはちょっと違うと思います。
それに対するお答えとして、92005にソースコードを書き込んだ積りでおりましたが、
そう明確に申し上げなかったのが私のミスだったかも知れません、お詫び申し上げます。

No91999
>10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
>https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

Northwindをダウンロードしてセウ族を試みましたが「接続の追加」のところでエラーになります。
エラー内容・・・
「SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。」

>Windows フォーム アプリケーションでのデータへの接続
>https://docs.microsoft.com/ja-jp/previous-versions/wxt2cwcc(v=vs.120)

実は私には「ADO.NET」の概念がイマイチ分かりません。
ADO.NETに関して、最新で分かり易い解説サイトなどありましたらお教えいただければ大変に有り難いのですが。

>TableAdapterのSELECT文を参照したい
>https://teratail.com/questions/163335
>【VS C#】Textboxから取得したstringで検索クエリ
>https://teratail.com/questions/157732

これらについては、ただいま勉強中です。
ぜひ参考にさせていただきたいと思っておりますが、ただ私にはまだC#のコードが分からないもので、
できればVB.NETによる関連記事をご紹介お願いしたいと存じます。

No92001
>10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
>https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688
>の Customers テーブルを tbl_部署に、Orders テーブルを tbl_社員に読み替えて
>チュートリアルと同様な形のアプリにするというのも検討の価値があると思います。

以上、お答えになっているかどうか分かりませんがよろしくお願いいたします。

>(2) 事前に SQL Server から全ての情報を DataTable に読み取ってからそれを操作する
>
>という条件でよければ、DataTable から DataView を取得して、その RowFilter プロパ
>ティに条件を設定すればできます。

具体的なソースコードを示していただきたいのですが・・・。
オブジェクト名は、92005の私のコードのものを使ってください。
ではよろしくお願い申し上げます。たかし



引用返信 編集キー/
■92019 / inTopicNo.16)  Re[10]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1880回)-(2019/08/18(Sun) 10:22:39)
No92018 (たかし さん) に返信

とりあえず一番肝心だと自分が思う点をレスします。その他は別途。

> No91989
> >あと、No91973 で魔界の仮面弁士さんからも質問されていますが、事前に SQL Server から
> >全ての情報を DataTable に読み取ってからそれを操作するのか、操作の都度 SQL Server
> >からデータを DataTable に読み取ってから操作したいのか、それともその間を取って
> >部署の方は前者で社員の方は後者としたいのですか?
>
> これは具体的に言うとどのようなことを指しているのでしょうか?
> もう少し詳しくお教え願えないでしょうか?

分からなかったら話を先に進める前に聞きましょう。でないと、話が噛み合わなくなります。

DataSet / DataTable は SQL Server データベース(SQL Server に限りませんが)のテーブル
を PC のメモリ上に取得してきて、いちいち DB にアクセスしなくてもプログラムで操作して
テーブルの内容の一覧の表示、編集・更新ができるようにするためのです。

詳しくは以下の記事の「非接続型データアクセスの動作とそのアドバンテージ」のセクション
を見てください。とりあえず「図1」と「図2」だけでも見ればどのように使うことを目的と
しているかが分かると思います。

DB 設計者のための明解 ADO.NET 第 1 回
https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)

まず、上記のことを理解してください。

で、上記質問に対する答えですが、質問者さんのレス No91972 に書いてあった、

> 退職者や新入社員、また部署の異動なども頻繁に行なわれます。

が、その頻度によってどのようにするかが変わってくるということです。

(1) 事前に SQL Server から全ての情報を DataTable に読み取ってからそれを操作
(2) 操作の都度 SQL Server からデータを DataTable に読み取ってから操作
(3) その間を取って部署の方は前者で社員の方は後者

例えば、四半期に 1 回程度の頻度であれば (1) で十分そうです。5 秒に 1 回とか
ですと (2) でないとダメそうです。部署テーブルは四半期に 1 回程度だが社員テー
ブルは社員テーブルは 10 分に 1 回とかですと (3) がよさそうということになります。

引用返信 編集キー/
■92020 / inTopicNo.17)  Re[10]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1881回)-(2019/08/18(Sun) 10:55:20)
No92018 (たかし さん) に返信

> 私のしたいことは、これとはちょっと違うと思います。
> それに対するお答えとして、92005にソースコードを書き込んだ積りでおりましたが、

No92005 の質問者さんのコードから何がしたいのかは読めませんでした。(正直言うと、
最初の話から変わりすぎていて、コードを読む気力がないと言った方が当たってます)

話が発散しそうなので、話を一番最初の質問 No91943 に戻しませんか?

それ以外の話は、ADO.NET の基本とか SQL Server の設定とか、いろいろ勉強してもら
ってからという感じがします。

No92019 で聞いた (1), (2), (3) どれにするかと、一番最初の質問 No91943 に戻すこと
で OK か答えてもらってから、以下の質問に答えます。

> 具体的なソースコードを示していただきたいのですが・・・。

ただし、

> オブジェクト名は、92005の私のコードのものを使ってください。

そんな自分勝手な話はナシです。質問者さんの DB、テーブルは第三者は持ってないので
検証ができませんし。

実際に DB を使う話をするなら、誰でも入手できる Northwind とか AdvenrureWorks など
をベースにしてください。


引用返信 編集キー/
■92021 / inTopicNo.18)  Re[10]: コンボボックスによる絞り込み
□投稿者/ WebSurfer (1882回)-(2019/08/18(Sun) 11:45:45)
No92018 (たかし さん) に返信

> Northwindをダウンロードしてセウ族を試みましたが「接続の追加」のところでエラーになります。
> エラー内容・・・
> 「SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。」

Northwind と Pubs を使えるようにする方法を紹介しておきます。

LocalDB で Northwind と Pubs を利用
http://surferonwww.info/BlogEngine/post/2017/05/16/use-northwind-and-pubs-on-localdb-2016.aspx

質問者さんが使っているのが SQL Server ではなく LocalDB であれば記事の通りに、SQL Server の場合
でもほとんどそのままの手順で Northwind と Pubs を使えるようになると思います。

引用返信 編集キー/
■92022 / inTopicNo.19)  Re[11]: コンボボックスによる絞り込み
□投稿者/ たかし (9回)-(2019/08/18(Sun) 15:57:25)
WebSurferさま、さっそくのご回答ありがとうございます。

>No92019 で聞いた (1), (2), (3) どれにするかと、一番最初の質問 No91943 に戻すこと
>で OK か答えてもらってから、以下の質問に答えます。

それで結構です。

>DB 設計者のための明解 ADO.NET 第 1 回
>https://docs.microsoft.com/ja-jp/previous-versions/cc482903(v=msdn.10)
>
>LocalDB で Northwind と Pubs を利用
>http://surferonwww.info/BlogEngine/post/2017/05/16/use-northwind-and-pubs-on-localdb-2016.aspx

これから熟読させていただくことにします。
また分からない事が出てくると思いますので、そのときは何卒よろしくお願いします。
とりあえず少しお時間をください。では

引用返信 編集キー/
■92023 / inTopicNo.20)  Re[12]: コンボボックスによる絞り込み
 
□投稿者/ たかし (10回)-(2019/08/18(Sun) 16:36:23)
WebSurferさま、

>LocalDB で Northwind と Pubs を利用
>http://surferonwww.info/BlogEngine/post/2017/05/16/use-northwind-and-pubs-on-localdb-2016.aspx

の通りにSQLを直したところ無事Northwind と Pubs をVisualStudioから開くことが出来ました。
まずはご報告まで。

引用返信 編集キー/

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

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -