- PR -

comboBoxでカラムを複数表示した場合のcomboBox1.txtについて

1
投稿者投稿内容
@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-08-24 15:21
VCで開発中のものです。comboBoxで複数カラムの表示をするようにしたのですが(コードと名称)、コンボボックスの編集フィールド(comboBox1.textだとおもうのですが)には、コードのみを表示したいのですが・・・ コンボリストの中で項目が選択されたときにItemをクリアしてコードのみにしてみたのですが、編集フィールドは空っぽになってしまいます。イベントのとり方がわるいのでしょうか?comboBox1.textを一度nullクリアしてみたりもしたのですが、うまくいきません。どなたかよい方法ご存知ないでしょうか?
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2004-08-24 15:42
始めまして、さかもと と申します。
初心者の中の初心者なのでお答えできないと思いますが、
現時点でのコードはどのように記述されているかを載せて
頂いた方が他の皆様にも分かりやすいかと思います。
(私のの理解力がないだけだとも思いますが)
それと、恥ずかしながらお聞きするのですが、VCとはどの言語
の略称なんですか?(無知なものですいません・・・。)

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-24 16:58
引用:

さかもとさんの書き込み (2004-08-24 15:42) より:

それと、恥ずかしながらお聞きするのですが、VCとはどの言語
の略称なんですか?(無知なものですいません・・・。)


 いえ、重要です。

 Visual C++ 6.0なのでしょうか?それともVisual C++ .NETでしょうか?


 コードをそのまま載せるより、自分で自分がしたいことを理解しているか、自分がコーディングしていることを理解しているかを量る為に、どのイベントハンドラで、どのような処理をしているか、列挙してみてください。
@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-08-25 09:23
さかもとさん JITTAさん適切な指摘ありがとうございます。これではわかりませんよね。VCとかいてしまいましたが、.NETC#です。私もはじめてやっと3週間目に突入です。ごめんなさい。
ソースを記載しますね。
まず Form_loadで、DataRow [] で宣言してあるrrにデータをセットしておいて、ITEMSにADDしました。

private void M10Form_Load(object sender, System.EventArgs e)
{
m10DataSet11.Clear();
sqlDataAdapter1.Fill(m10DataSet11,"M10_F");
comboBox1.Items.Clear();
rr = m10DataSet11.Tables["M10_F"].Select();
if (rr.Length == 0)
{
MessageBox.Show("データが存在しません");
return;
}
for (int i=0; i<rr.Length; i++)
comboBox1.Items.Add(rr[i]["M10_CODE1"].ToString()   + "\t " + rr [i]["M10_RKNM1"].ToString());
}
}

で、ここからなんですが、
key =comboBox1.SelectedIndex;
comboBox1.Text = rr[key]["M10_CODE1"].ToString();
のコードを、comboBox1_SelectedIndexChangedにかいてもうまくいかず、他のフォーラムで
comboBox1.Text = null;にセットしてからセットとかあったのでそれをやったのですがそれでもだめで。
(ちなみにcomboBox1.Text = null;をcomboBox1_SelectedIndexChangedに書いたらエラーになってしまいました)
で、現在はcomboBox1_SelectionChangeCommittedに上記のコードを書いて、
comboBox1.Items.RemoveAt(key);
comboBox1.Items.Insert(key,b_cd);といちど、選択したlowを削除してコードのみにしてフォーカスを一度はすしたところ、なんとかコードのみの表示になりました。ただ、このやり方では選択するたびに、このままだとリストの中はコードのみになってしまうので、コンボのドロップダウンをおしたら、もういちどrrからitemsにセットしなおしをすることになります。なんか不効率というか・・・
無理やりというか・・・・
これは初心者の浅はかなやり方ですよね・・・・?
上記を読んでなにか助言をいただけないでしょうか?よろしくお願いいたします。
あ。ついでといっては失礼ですが、comboBox1.Items.Addするときに"\t"が効かないのですが、何か設定があるのでしょうか?隣のマシンのソースではうまくいってるようなんですけど・・・(こんなに書いていいのですかね。すみません)


Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-25 11:11
本題から外れたところで気になったので。

引用:

@suikaさんの書き込み (2004-08-25 09:23) より:
コード:
 
private void M10Form_Load(object sender, System.EventArgs e)
{
	m10DataSet11.Clear();
	sqlDataAdapter1.Fill(m10DataSet11,"M10_F");
	comboBox1.Items.Clear();
	rr = m10DataSet11.Tables["M10_F"].Select();
	if (rr.Length == 0)
	{
		MessageBox.Show("データが存在しません");
		return;
	}
		for (int i=0; i<rr.Length; i++)
			comboBox1.Items.Add(rr[ i]["M10_CODE1"].ToString()
				+ "¥t     "
				+ rr[ i]["M10_RKNM1"].ToString());
	}
}




ボールドにしたところですが、
コード:
if (m10DataSet11.Tables["M10_F"].Rows.Count == 0) {
	MessageBox.Show("データが存在しません");
	return;
}
foreach (DataRow rr in m10DataSet11.Tables["M10_F"].Rows) {
	comboBox1.Items.Add(rr["M10_CODE1"].ToString()
		+ "¥t"
		+ rr["M10_RKNM1"].ToString());
}

@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-08-25 14:50
引用:

Jittaさんの書き込み (2004-08-25 11:11) より:
本題から外れたところで気になったので。

引用:

@suikaさんの書き込み (2004-08-25 09:23) より:
コード:
 
private void M10Form_Load(object sender, System.EventArgs e)
{
	m10DataSet11.Clear();
	sqlDataAdapter1.Fill(m10DataSet11,"M10_F");
	comboBox1.Items.Clear();
	rr = m10DataSet11.Tables["M10_F"].Select();
	if (rr.Length == 0)
	{
		MessageBox.Show("データが存在しません");
		return;
	}
		for (int i=0; i<rr.Length; i++)
			comboBox1.Items.Add(rr[ i]["M10_CODE1"].ToString()
				+ "¥t     "
				+ rr[ i]["M10_RKNM1"].ToString());
	}
}




ボールドにしたところですが、
コード:
if (m10DataSet11.Tables["M10_F"].Rows.Count == 0) {
	MessageBox.Show("データが存在しません");
	return;
}
foreach (DataRow rr in m10DataSet11.Tables["M10_F"].Rows) {
	comboBox1.Items.Add(rr["M10_CODE1"].ToString()
		+ "¥t"
		+ rr["M10_RKNM1"].ToString());
}




すっきりしたソースにしてくださってありがとうございました!foreach文おぼえます!
コンボの問題はとりあえず、コンボボックスを最小表示にしてドロップダウンのボタンのみ表示するようにして、テキストボックスとくみあわせて(少し見た目がわるいですけど)にげることにしました。上記のように書くと、コンボリストを表示中(リストな内の項目を選択中)はコンボボックスの値はどうしてもきれいに扱えないようなので。
でも、なにか、よい方法がありましたら教えてくださいね。ありがとうございました。
Hodgkin
常連さん
会議室デビュー日: 2003/07/18
投稿数: 34
投稿日時: 2004-08-25 18:03
何がしたいかがいまいち見えないですが、下記のようなことを実現したいという
認識でよろしいでしょうか?
 ・コンボボックスにはコードのみを表示する
 ・コンボボックスのドロップダウンにはコード+名称を表示する

上記の内容を実現すると言う前提で話をします。
考え方を切り替えてコンボボックスの表示を編集するのではなく、
ドロップダウンで表示する内容を編集するように考えましょう。

まず、下記のプロパティを変更してドロップダウンリストの描画を独自で実装するようにします。
 ComboBox.DrawMode = DrawMode.OwnerDrawFixed;

このままプログラムを実行すると、ドロップダウンには何も表示されません。
(表示はされませんが、選択は出来るようです。)

独自の描画処理はDrawItemに記述します。
DrawItemイベントの記述は下記のサイトが参考になると思います。

http://dobon.net/vb/dotnet/control/cbownerdraw.html

このサイトのサンプルコードを少し修正すれば実現可能だと思います。
自分もVB.NETでやってみましたが@suikaさんが求めているであろう仕様は実現できました。

もし、可能であればComboBoxを継承して業務仕様にあったコンポーネントの作成に
チャレンジしてみてください。

#業務仕様として、コードのみ表示って良いのでしょうか?
#自分の感覚だとユーザーにコードを意識させないシステムの方がいいと思っています。
#どこかのパッケージで「もう勘定科目はいらない・・・」って宣伝しているぐらいですし。
#もちろん、いろんなユーザーさんがいるんで価値観の問題かも知れませんが。
@suika
会議室デビュー日: 2004/08/24
投稿数: 13
投稿日時: 2004-08-26 13:14
引用:

Hodgkinさんの書き込み (2004-08-25 18:03) より:
何がしたいかがいまいち見えないですが、下記のようなことを実現したいという
認識でよろしいでしょうか?
 ・コンボボックスにはコードのみを表示する
 ・コンボボックスのドロップダウンにはコード+名称を表示する

上記の内容を実現すると言う前提で話をします。
考え方を切り替えてコンボボックスの表示を編集するのではなく、
ドロップダウンで表示する内容を編集するように考えましょう。

まず、下記のプロパティを変更してドロップダウンリストの描画を独自で実装するようにします。
 ComboBox.DrawMode = DrawMode.OwnerDrawFixed;

このままプログラムを実行すると、ドロップダウンには何も表示されません。
(表示はされませんが、選択は出来るようです。)

独自の描画処理はDrawItemに記述します。
DrawItemイベントの記述は下記のサイトが参考になると思います。

http://dobon.net/vb/dotnet/control/cbownerdraw.html

このサイトのサンプルコードを少し修正すれば実現可能だと思います。
自分もVB.NETでやってみましたが@suikaさんが求めているであろう仕様は実現できました。

もし、可能であればComboBoxを継承して業務仕様にあったコンポーネントの作成に
チャレンジしてみてください。

#業務仕様として、コードのみ表示って良いのでしょうか?
#自分の感覚だとユーザーにコードを意識させないシステムの方がいいと思っています。
#どこかのパッケージで「もう勘定科目はいらない・・・」って宣伝しているぐらいですし。
#もちろん、いろんなユーザーさんがいるんで価値観の問題かも知れませんが。



返答ありがとうございました!
一応、ドロップダウンリストの内容を編集しております。それで、リスト内の内容がそのままコンボテキストに反映してしまうので困っておりました。DrawItemはドロップダウンリスト内の描画ですが、今回はとくにフォントを変えたりするわけでもないのでいいのかなぁとおもったのですが。。少し作業が落ち着いたら、仕様にそったコンポーネントの作成に挑もうかとおもいます。
追加で記載してくださったコード表示ですが、まあ、いろいろですね。コードのみをコンボボックスに表示ですが当然、名称等も他のエリアに表示させております。あと、コードをほとんど記憶していて、新規追加したコードを検索したいときにコンボを活用されるといった具合です。古い考え方かもしれませんが、なんでもドロップさせて検索させる方法は時間がかかるものです。それぞれ業務にあった方法で客先の日々のながれにそった開発をすすめていきたいものです(^^; 貴重な意見をありがとうございました。コンポーネント作成しましたらまた書き込みます!
1

スキルアップ/キャリアアップ(JOB@IT)