http://q.hatena.ne.jp/1188038837

の続きですが、どうやら原因はDBやDataSetがtinyint型なのに選択された値がString型だから、Comboboxで選択した瞬間、アプリの動作が停止してしまうようでした。ためしにDisplayMemberをValueMemberと同じ値にすると動きました。しかし表示したい値と入力される値を変えたいのでこれでは意味がありません。DBやDataSetの型を文字列系にすればいいと思われますが、使用する値はリレーションされたテーブルのIDなためDataSetでAutoIncrementされています。なのでSystem.Int32という型以外指定できません。このような場合どうされているのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:2007/09/13 15:09:07
  • 終了:2007/09/20 13:06:02

回答(2件)

id:thrillseeker No.1

thrillseeker回答回数328ベストアンサー獲得回数372007/09/14 23:11:33

確認ですが、ValueMember や DisplayMember には DataSource

としているテーブルの「カラム名」を string で指定していますよね?

例えばテーブル内に以下の2つのカラムが有る場合、

(1) [カラム名] ID [型] int [値] 0,1,2,3,4,5

(2) [カラム名] NAME [型] string  [値] いち,に,さん,し,ご

this.comboBox1.ValueMember = "ID";
this.comboBox1.DisplayMember = "NAME";

となるはずです。

id:artsnet111

はい、文字列で指定しています。

2007/09/15 15:08:45
id:freemann No.2

freemann回答回数305ベストアンサー獲得回数482007/09/18 07:42:02

ポイント70pt

以下のようにすればいけるようです。

(1)CategoriesとTestの二つのテーブルのデータソースを作る。

(2)Testのデータソースをテキストボックスでフォームにドラッグ&ドロップしてBindingNavigatorを作っておく。

(3)ツールボックスからコンボボックスを選択し、フォームに作っておく。(comboBox1)

(4)comboBox1のDataSourceにCategoriesデータソースを指定し、DisplayMemberにCategoryNameを、ValueMemberにCategoryIDを設定する。

(5)以下のコードを追加する。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)はコンボボックスのイベント

private void bindingNavigatorPositionItem_TextChanged(object sender, EventArgs e)は、BindingNavigatorのレコード番号指定のテキストボックスのイベント

です。

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

{

if (comboBox1.SelectedValue != null)

{

cat_idTextBox.Text = comboBox1.SelectedValue.ToString();

}

}


private void bindingNavigatorPositionItem_TextChanged(object sender, EventArgs e)

{

try

{

if (cat_idTextBox.Text != null || cat_idTextBox.Text != "")

{

comboBox1.SelectedValue = Convert.ToInt32(cat_idTextBox.Text);

}

else

{

comboBox1.SelectedValue = 0;

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

(注意)

cat_idのテキストボックスは最初見えるようにしていて、うまく動くか確認して、そのあとVisibleをfalseにして見えないようにしておくとよいと思います。

id:artsnet111

思うような動きができました。

ありがとうございました。

2007/09/20 13:05:03
  • id:KUROX
    <独り言>

    質問を見るたびに思いますが、
    DB連結コントロールを使う方向性をやめた方が
    よさそうに思うのですが。



    Accessあたりを使うとか。
  • id:artsnet111
    artsnet111 2007/09/13 15:19:52
    社内の方針でそれはできません。
    そもそもそれができないから
    お金を払って質問しているのですが…
  • id:freemann
    いまいち何で困っているのかがよくつかめてないです。
    もう少し詳しく書いてくれたら、答えられると思います。
    ちなみに以前コメントで書いたソースです。
    NorthwindのCategoriesのテーブルを使っています。
    <pre>
    private void Form1_Load(object sender, EventArgs e)
    {
    this.categoriesTableAdapter.Fill(this.northwindDataSet.Categories);
    this.comboBox1.DataSource = this.northwindDataSet.Tables[0];
    this.comboBox1.DisplayMember = "CategoryName";
    this.comboBox1.ValueMember = "CategoryID"; //ここはint型のデータが入ってますが、なにでつまずいているのでしょうか?
    this.comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
    this.comboBox1.SelectedIndex = 0;
    }
    </pre>
  • id:artsnet111
    artsnet111 2007/09/13 17:20:56
    具体的に言いますと、担当者テーブルに担当者のIDと担当者名のフィールドがあって、社員テーブルをバインドしたフォームの担当者Comboboxに担当者テーブルをバインドします。要は社員を登録するフォームの担当者を選ぶComboboxを担当者名で選択したいということです。ただ、担当者IDは自動連番になるようにDataSet.xsd上で担当者IDのAutoIncrementプロパティをtrueにしています。すると社員テーブルの方の担当者IDにあたる外部キーの型も同型ではいけないエラーが出ますので両方の型をDataSet.xsd上でSystem.Int32とします。これでAutoIncrementされます。しかしそうするとDisplayMemberで担当者名を指定しているとフォーム実行時そこで止まってしまいます。DisplayMemberを担当者IDに変えると動きます。
  • id:KUROX
    >社内の方針でそれはできません。

    どうも失礼したいしました。

  • id:freemann
    ちょっと考えてはいるんですが、よくわからないことがあるので質問させてください。

    フォームに社員テーブルをバインドしてとあるので、以前の質問での方法でバインドしていると考えています。その時に、社員テーブルの中の担当者のデータも一緒に作成しているなら、その担当者カラムはすでに登録されているデータが一つしか入ってないと考えています。たとえコンボボックスでも。
    そうなると、一覧から選ぶとなると担当者カラムのデータを選べるようにするために担当者のコンボボックスは担当者テーブルが入っているデータソースからドラッグ&ドロップをしているのかとも考えていたのですが、このやり方だと担当者テーブルの1行目のデータしか表示されないかったので、これも違うのかと考えてます。
    となると、ツールボックスからコンボボックスを作成して、担当者テーブルからのデータはコードで書きながら引っ張っているのだろうかというところに落ち着くのですが、そうなると、Updateのときに別口でSQL文を投げないといけなくなるような気がするのですが、今のところどのように設計しているのでしょうか?

    長く、わかりづらい質問ですみません。
  • id:artsnet111
    artsnet111 2007/09/17 13:00:51
    コンボボックスに担当者テーブルをバインドする方法は、コードベースでなくコンボボックスのプロパティで設定しています。コンボボックスの右上に出る▲みたいなマークをクリックして設定する所です。
    今のところ社員テーブルのデータは作成していません。担当者テーブルのデータを増やすと社員の新規登録画面で担当者コンボボックスのリストがきちんと増えるのは確認できました。
    簡単に言うと入力時DisplayMemberである担当者名(たとえば「a」)を選択するとコンボボックスの入力値の型はintなのでそこで固まってしまうという事です。普通に考えたらDisplayMemberであって入力値はValueMemberなのだからValueMemberがちゃんと数値なら固まらないと思ってそう作ったのですが。

    ためしに以下の手順で再現できます。
    1.Northwnd.mdfにtestテーブルを追加しDataSetに追加。
     ・id (int) not NULL (主キー)
     ・cat_id (int) not NULL
     ・other (nvarchar50)
    2.DataSet.xsd上でtestテーブルのidのAutoIncrementプロパティをtrueにする。
    3.Form1にtestテーブルをドラッグしてバインド。この時cat_idはコンボボックスにして、idのReadOnlyをtrue。
    4.cat_idコンボボックスにCategoriesテーブルをバインドする。DisplayMemberにCategoryName、ValueMemberにCategoryID。「選択された値」のところにtestテーブルのcat_idを指定。
    5.実行し、新規登録をしようとするとコンボボックスのところで固まる。
  • id:freemann
    2番まではわかるのですが、3番以降がちょっとわかりません。

    3番で「Form1にtestテーブルをドラッグしてバインド。この時cat_idはコンボボックスにして、idのReadOnlyをtrue。」とあるので、Form1にBindingNavigatorを使って、cat_idはコンボボックス表示で、idはテキストボックスかラベルで表示しているのかなとおもうのですが、それだと次の4番がわからないです。
    「cat_idコンボボックスにCategoriesテーブルをバインドする。」とあるのですが、cat_idコンボボックスには、cat_idがバンドされているのではないのですか?もしくは、私がコンボボックスの使い方をきちんとわかっていないのかな・・・。
    DisplayMemberにCategoryNameをValueMemberにCategoryIDを設定したら、これはCategoriesテーブルがバインドされているってことではないのでしょうか?
    「選択された値」というのは、SelectedValueのことでしょうか?

    ちょっと考えると、testテーブルが担当者テーブルの役目をしていて、Categoriesテーブルが社員テーブルの役目なのでしょうか?

    なんか、わからなくてすみません。
  • id:artsnet111
    artsnet111 2007/09/17 16:52:00
    いや、多分私のほうが理解できていないんだと思います。

    結局やりたいことは社員の新規登録画面で、担当者テーブルをデータテーブルとしたコンボボックスを表示し、ユーザーには担当者名で選ばせて内部的には社員テーブルの担当者IDに値が入るようにしたいだけです。

    私はただ単に社員の新規登録画面にコンボボックスを配置して、そのコンボボックスを担当者テーブルとバインドすれば実現すると思ってました。SelectedValueで社員テーブルの担当者IDを指定しておけば入るのかと思ってました。

    「選択された値」というのは、SelectedValueです。

    例の場合testテーブルが社員テーブルの役目をしていて、Categoriesテーブルが担当者テーブルの役目ですね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません