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

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

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

Re[10]: コンボボックスとテキストボックスの連動


(過去ログ 122 を表示中)

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

■73121 / inTopicNo.1)  コンボボックスとテキストボックスの連動
  
□投稿者/ 巻 (5回)-(2014/08/21(Thu) 10:21:35)

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

使用ソフト
Microsoft Visual Studio 2010
.net framework 4

短期間のうちに何度も質問申し訳ありません。


やりたいこと

1、生徒名簿というテーブルがあり
列1:名簿番号
列2:生徒氏名
があるので、 生徒氏名をコンボボックスに表示させる。

2、テキストボックスには、コンボボックスで選択された生徒の名簿番号が表示される。

3、テキストボックスに名簿番号を入力すると、コンボボックスがその名簿番号の生徒氏名に切り替わる。


現在出来ていること
 ・コンボボックスに生徒氏名を表示させる



選択された生徒の名簿番号を取得できるSQL文として

[SELECT [名簿番号] FROM [生徒名簿] WHERE [生徒氏名] IN ('[生徒氏名]') ORDER BY [名簿番号] ;]

で呼び出そうとしているのですが、データバインドの仕方が分からないです。

TextBox.DataBindings.Add("Text", DataSouce, "[名簿番号]")

とやってみたところ

[DataSourceのプロパティまたは列 [生徒名簿]にバインドできません。]

というエラーが出てしまい、実行されませんでした。(確認しましたが[名簿番号]カラムは存在しました)

ご教授お願い致します。
引用返信 編集キー/
■73122 / inTopicNo.2)  Re[1]: コンボボックスとテキストボックスの連動
□投稿者/ 魔界の仮面弁士 (86回)-(2014/08/21(Thu) 10:57:21)
No73121 (巻 さん) に返信
> [SELECT [名簿番号] FROM [生徒名簿] WHERE [生徒氏名] IN ('[生徒氏名]') ORDER BY [名簿番号] ;]

その IN の指定方法だと、「=」と同じ意味になりますが、
複数並べなくて良いのでしょうか?

 WHERE [生徒氏名] IN ('氏名A', '氏名B', '氏名C')


> (確認しましたが[名簿番号]カラムは存在しました)
"[名簿番号]"カラムではなく、
"名簿番号"カラムだったりはしませんか?
引用返信 編集キー/
■73127 / inTopicNo.3)  Re[2]: コンボボックスとテキストボックスの連動
□投稿者/ 巻 (7回)-(2014/08/21(Thu) 12:45:38)
No73122 (魔界の仮面弁士 さん) に返信

今回も返信ありがとうございます。

>>[SELECT [名簿番号] FROM [生徒名簿] WHERE [生徒氏名] IN ('[生徒氏名]') ORDER BY [名簿番号] ;]
>
> その IN の指定方法だと、「=」と同じ意味になりますが、
> 複数並べなくて良いのでしょうか?

選択した生徒1人の名簿番号だけを表示したいので、1つで大丈夫です。

>>(確認しましたが[名簿番号]カラムは存在しました)
> "[名簿番号]"カラムではなく、
> "名簿番号"カラムだったりはしませんか?

確認しましたが、カラム名は間違っていませんでした。
引用返信 編集キー/
■73129 / inTopicNo.4)  Re[3]: コンボボックスとテキストボックスの連動
□投稿者/ すず (4回)-(2014/08/21(Thu) 13:23:29)
No73127 (巻 さん) に返信
魔界の仮面弁士 さんのアドバイスは、

TextBox.DataBindings.Add("Text", DataSouce, "名簿番号")

のように角括弧[]を取ってみたらどうか、ということではないかと思います。

※SQLでは慣例としてカラム名を角括弧[]で区切り[名簿番号]とする場合がありますが、
 実際のカラム名は角括弧[]のない"名簿番号"なのではないか、ということです。
引用返信 編集キー/
■73130 / inTopicNo.5)  Re[4]: コンボボックスとテキストボックスの連動
□投稿者/ http:// (1回)-(2014/08/21(Thu) 13:40:45)
No73129 (すず さん) に返信

返信ありがとうございます。

> TextBox.DataBindings.Add("Text", DataSouce, "名簿番号")
>
> のように角括弧[]を取ってみたらどうか、ということではないかと思います。

勘違いをさせてしまい申し訳ありません。
元々は角括弧を取った状態で記述してあります。
[]を付けた方が分かりやすいかなと思い付けたものでしたが、
先に記述してあることを書いておかなければなりませんでしたね…。
申し訳ありませんでした。

ご指摘ありがとうございます。
引用返信 編集キー/
■73131 / inTopicNo.6)  Re[5]: コンボボックスとテキストボックスの連動
□投稿者/ 巻 (8回)-(2014/08/21(Thu) 13:42:56)
No73130 (http:// さん) に返信
> ■No73129 (すず さん) に返信
>
> 返信ありがとうございます。
>
>>TextBox.DataBindings.Add("Text", DataSouce, "名簿番号")
>>
>>のように角括弧[]を取ってみたらどうか、ということではないかと思います。
>
> 勘違いをさせてしまい申し訳ありません。
> 元々は角括弧を取った状態で記述してあります。
> []を付けた方が分かりやすいかなと思い付けたものでしたが、
> 先に記述してあることを書いておかなければなりませんでしたね…。
> 申し訳ありませんでした。
>
> ご指摘ありがとうございます。

申し訳ありません、73130は自分です。失礼致しました。
引用返信 編集キー/
■73133 / inTopicNo.7)  Re[5]: コンボボックスとテキストボックスの連動
□投稿者/ 魔界の仮面弁士 (88回)-(2014/08/21(Thu) 14:52:54)
No73130 (巻 さん) に返信
>> 複数並べなくて良いのでしょうか?
> 選択した生徒1人の名簿番号だけを表示したいので、1つで大丈夫です。
であれば IN ではなく、= で良いのでは…。


No73130 (http:// さん) に返信
> []を付けた方が分かりやすいかなと思い付けたものでしたが、
> 先に記述してあることを書いておかなければなりませんでしたね…。

ふむ。では、SQL などのデータベース処理の部分は一切無視して、
データバインドの部分のみについて書いてみます。


下記のサンプルでは、TextBox を 2 つ用意しており、
どちらにも「名簿番号」が表示されるようになっています。

txt1 は、名簿番号を書き換えるためのもので、
txt2 は、ComboBox の選択項目を変更するためのものです。


Public Class Form1
 Private WithEvents cmb As ComboBox
 Private WithEvents txt1 As TextBox
 Private WithEvents txt2 As TextBox
 Private ds As DataSet
 Private bs As BindingSource
 Private ep As ErrorProvider
 Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  txt1 = New TextBox()
  txt2 = New TextBox()
  txt1.SetBounds(32, 32, 200, -1)
  txt2.SetBounds(32, 64, 200, -1)
  Controls.Add(txt1)
  Controls.Add(txt2)
  cmb = New ComboBox()
  cmb.SetBounds(32, 100, 200, -1)
  Controls.Add(cmb)

  ds = New DataSet()
  Dim tbl = ds.Tables.Add("生徒名簿")
  tbl.PrimaryKey = New DataColumn() {tbl.Columns.Add("名簿番号", GetType(Integer))}
  tbl.Columns.Add("生徒氏名", GetType(String))
  tbl.Rows.Add(100, "碇屋長助")
  tbl.Rows.Add(200, "新井忠")
  tbl.Rows.Add(300, "紫村健")
  tbl.Rows.Add(400, "須和真司")
  tbl.AcceptChanges()

  bs = New BindingSource()
  bs.DataSource = ds
  bs.DataMember = tbl.TableName

  'txt1.ReadOnly = True
  txt1.DataBindings.Add("Text", bs, "名簿番号", False, DataSourceUpdateMode.OnValidation)

  cmb.DataSource = bs
  cmb.ValueMember = "名簿番号"
  cmb.DisplayMember = "生徒氏名"

  txt2.DataBindings.Add("Text", cmb, "SelectedValue", False, DataSourceUpdateMode.OnValidation)

  ep = New ErrorProvider(Me)
  ep.BindToDataAndErrors(bs, "")
 End Sub

 Private Sub txt1_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles txt1.Validating
  Try
   bs.EndEdit()
   bs.Current.Row.ClearErrors()
  Catch ex As Exception
   e.Cancel = True
   bs.Current.Row.SetColumnError("名簿番号", ex.Message)
  End Try
 End Sub
End Class


txt1 や ep は説明のためのオマケ機能です。今回の案件では不要なはず…。
引用返信 編集キー/
■73134 / inTopicNo.8)  Re[6]: コンボボックスとテキストボックスの連動
□投稿者/ 巻 (9回)-(2014/08/21(Thu) 15:06:16)
2014/08/21(Thu) 15:14:36 編集(投稿者)

No73133 (魔界の仮面弁士 さん) に返信

返答並びにサンプルありがとうございます。

お教え頂いた通り記述したところ、

>   cmb.ValueMember = "名簿番号"

ここで
[新しい表示メンバにバインドできません。]
というエラーが発生してしまいました。
引用返信 編集キー/
■73136 / inTopicNo.9)  Re[7]: コンボボックスとテキストボックスの連動
□投稿者/ 魔界の仮面弁士 (89回)-(2014/08/21(Thu) 17:05:23)
No73134 (巻 さん) に返信
> お教え頂いた通り記述したところ、
>>  cmb.ValueMember = "名簿番号"
> ここで
> [新しい表示メンバにバインドできません。]
> というエラーが発生してしまいました。

メンバー名の指定が間違っていたときに発生するエラーですね。

新規プロジェクトにて、コントロール等を一切貼っていないフォーム上に
No73133 のコードをそのまま貼れば動作するはずなのですが…何故でしょうね。

(少なくとも、当方の VB2010 でエラーが表示されることはありませんでした)
引用返信 編集キー/
■73162 / inTopicNo.10)  Re[8]: コンボボックスとテキストボックスの連動
□投稿者/ http:// (2回)-(2014/08/25(Mon) 08:59:23)
No73136 (魔界の仮面弁士 さん) に返信

返信が遅れてしまい本当に申し訳ありません!
教えて頂いたサンプルが上手く動き、その中の

bs.DataSource = ds bs.DataMember = tbl.TableName

'txt1.ReadOnly = True txt1.DataBindings.Add("Text", bs, "名簿番号", False, DataSourceUpdateMode.OnValidation)

cmb.DataSource = bs cmb.ValueMember = "名簿番号" cmb.DisplayMember = "生徒氏名"

txt2.DataBindings.Add("Text", cmb, "SelectedValue", False, DataSourceUpdateMode.OnValidation)

を自プログラムに少し変更を加え組み込んだところ、思い通りの動きをしました!
本当にありがとうございました!

解決済み
引用返信 編集キー/
■73163 / inTopicNo.11)  Re[9]: コンボボックスとテキストボックスの連動
□投稿者/ 巻 (10回)-(2014/08/25(Mon) 09:00:25)
No73162 (http:// さん) に返信
> ■No73136 (魔界の仮面弁士 さん) に返信
>
> 返信が遅れてしまい本当に申し訳ありません!
> 教えて頂いたサンプルが上手く動き、その中の
>
> bs.DataSource = ds bs.DataMember = tbl.TableName
>
> 'txt1.ReadOnly = True txt1.DataBindings.Add("Text", bs, "名簿番号", False, DataSourceUpdateMode.OnValidation)
>
> cmb.DataSource = bs cmb.ValueMember = "名簿番号" cmb.DisplayMember = "生徒氏名"
>
> txt2.DataBindings.Add("Text", cmb, "SelectedValue", False, DataSourceUpdateMode.OnValidation)
>
> を自プログラムに少し変更を加え組み込んだところ、思い通りの動きをしました!
> 本当にありがとうございました!

またやってしまった…
コレも自分です。失礼致しました。
改めてありがとうございました!
引用返信 編集キー/
■73165 / inTopicNo.12)  Re[9]: コンボボックスとテキストボックスの連動
□投稿者/ 魔界の仮面弁士 (96回)-(2014/08/25(Mon) 09:10:52)
No73162 (http:// さん) に返信
No73163 (巻 さん) に返信

No73163 で「解決済み」チェックが外されたので、外したままにしておきます。

>> お教え頂いた通り記述したところ、
>> [新しい表示メンバにバインドできません。]
>> というエラーが発生してしまいました。
>
> 教えて頂いたサンプルが上手く動き、その中の

結局、エラーの原因は何だったのでしょうか?



>> お教え頂いた通り記述したところ、
が実際には、その通りの記述になっていなかったのでしょうか?

それとも、提示したサンプルコードには環境依存の不足箇所があって、
>> 少し変更を加え組み込んだところ、
という追加作業が必要だったということでしょうか?
引用返信 編集キー/
■73192 / inTopicNo.13)  Re[10]: コンボボックスとテキストボックスの連動
□投稿者/ 巻 (11回)-(2014/08/27(Wed) 15:11:48)
No73165 (魔界の仮面弁士 さん) に返信

またもや返信が遅くなってしまい、本当に申し訳ありません…。

> 結局、エラーの原因は何だったのでしょうか?

お恥ずかしいことに、自分の勝手な勘違いでした。

> 新規プロジェクトにて、コントロール等を一切貼っていないフォーム上に
> No73133 のコードをそのまま貼れば動作するはずなのですが

この事を考えておらず、自分のプログラムに(そのままではありませんが)組み込んでいたため、出現したエラーでした。
ですので、

>> お教え頂いた通り記述したところ、
> が実際には、その通りの記述になっていなかったのでしょうか?
>
> それとも、提示したサンプルコードには環境依存の不足箇所があって、
> >> 少し変更を加え組み込んだところ、
> という追加作業が必要だったということでしょうか?

お教えいただいたサンプルのコードが間違っていたということは全くなく、しっかりと動作しました。
申し訳ありません。自分の勉強不足が浮き彫りとなったことを改めて感じました。
これからもお世話になることがあるかと思いますが、よろしくお願いいたします。
ありがとうございました、失礼いたします。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -