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

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

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

Re[6]: コンボボックスで初期値の設定方法を教えてください。


(過去ログ 130 を表示中)

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

■76943 / inTopicNo.1)  コンボボックスで初期値の設定方法を教えてください。
  
□投稿者/ ミーアキャット (8回)-(2015/08/31(Mon) 11:13:26)

分類:[.NET 全般] 

コンボボックスで初期値の設定方法を教えてください。
以下の通りです。

public partial class baseComboBox : ComboBox
{
DataTable table;

public baseComboBox()
{
InitializeComponent();
}

public DataTable Table
{
get { return (table); }
set { table = value; }
}

protected void MakeTableColumnsName(string[] strcols)
{
this.table = new DataTable();
for(int inum = 0; inum < strcols.Count(); inum++) this.table.Columns.Add(strcols[inum]);
}

protected void MakeTableAddRowDatas(object[] rowdatas)
{
DataRow dr;
this.table.Rows.Add(dr = this.table.NewRow());
for(int inum = 0; inum < rowdatas.Count(); inum++) dr[inum] = rowdatas[inum];
}
}

public class cmbboxname : baseComboBox
{
DataTable datatable = new DataTable();

public cmbboxname()
{
this.LoadItems();
}

private void LoadItems()
{
this.MakeTableColumnsName(new string[] { "NO", "NAME" });
this.MakeTableAddRowDatas(new object[] { 1, "北海道" });
this.MakeTableAddRowDatas(new object[] { 1, "青森" });
this.DataSource = this.Table;
this.DisplayMember = "NAME";
//  <<ここで初期値を指定したい。>>
}
}
引用返信 編集キー/
■76944 / inTopicNo.2)  Re[1]: コンボボックスで初期値の設定方法を教えてください。
□投稿者/ WebSurfer (644回)-(2015/08/31(Mon) 11:18:55)
No76943 (ミーアキャット さん) に返信
> コンボボックスで初期値の設定方法を教えてください。

何を作っているんですか? ご自分の環境は書けませんか? 
初期値というのは SelectedItem とか SelectedIndex のことですか?
引用返信 編集キー/
■76945 / inTopicNo.3)  Re[2]: コンボボックスで初期値の設定方法を教えてください。
□投稿者/ ミーアキャット (9回)-(2015/08/31(Mon) 11:23:06)
No76944 (WebSurfer さん) に返信
> 何を作っているんですか? ご自分の環境は書けませんか? 
環境は c# .Net です。

> 初期値というのは SelectedItem とか SelectedIndex のことですか?

this.MakeTableColumnsName(new string[] { "NO", "NAME" });
this.MakeTableAddRowDatas(new object[] { 1, "北海道" });
this.MakeTableAddRowDatas(new object[] { 1, "青森" });
this.Items.Add("北海道");    ←この2行を入れるとSelectedIndex = 1
this.Items.Add("青森");     ←が使えるようになりましたが、変更されませんでした。
this.DataSource = this.Table;
this.DisplayMember = "NAME";
this.SelectedIndex = 1;     ←これだけだとエラーが出たので上の2行追加しました。
引用返信 編集キー/
■76946 / inTopicNo.4)  Re[3]: コンボボックスで初期値の設定方法を教えてください。
□投稿者/ ミーアキャット (10回)-(2015/08/31(Mon) 11:25:42)
> ■No76944 (WebSurfer さん) に返信
>>何を作っているんですか?
 コンボボックスです。

引用返信 編集キー/
■76947 / inTopicNo.5)  Re[4]: コンボボックスで初期値の設定方法を教えてください。
□投稿者/ WebSurfer (645回)-(2015/08/31(Mon) 11:44:19)
No76946 (ミーアキャット さん) に返信

「何を作っているのか?」というのは、アプリケーションは何ですかとい
う意味です。Windows Forms, WPF, ASP.NET Web Forms, その他いろいろ
あります。ComboBox ということから Windows Forms アプリではないかと
想像していますが、想像で答えて、想像が間違っているの混乱を招くばか
りですので聞いています。

「環境」というのは、OS, .NET, Visual Studio のバージョン、DB を使
っているなら DB サーバーとそのバージョン、Web アプリなら IIS のバ
ージョンや使っているブラウザなどの情報も追加で必要です。

適切に情報が提供されていれば、回答者が質問者さんの状況を的確に把握
でき、タイムリーで的を得た回答が得られるということで、質問者さんに
もメリットがあります。

面倒と思っているかもしれませんが、きちんと書くことをお勧めします。
引用返信 編集キー/
■76948 / inTopicNo.6)  Re[4]: コンボボックスで初期値の設定方法を教えてください。
□投稿者/ 魔界の仮面弁士 (473回)-(2015/08/31(Mon) 12:05:50)
No76946 (ミーアキャット さん) に返信
>>>何を作っているんですか?
> コンボボックスです。

「コンボボックス」と一口に言っても、
WPF の System.Windows.Controls.ComboBox とか
WinForms の System.Windows.Forms.ComboBox とか
ASP.NET AJAX Control Toolkit の ComboBox とか
などと、いろいろと種類があったりします。


とりあえず、System.Windows.Forms.ComboBox と理解。



> this.MakeTableAddRowDatas(new object[] { 1, "北海道" });
> this.MakeTableAddRowDatas(new object[] { 1, "青森" });
北海道も青森も、共に No=1 なのですね?


> ここで初期値を指定したい
データバインドは、コントロールが生成された後で実施されます。
コンストラクタの中では、まだバインドされていないため、
.SelectedIndex が -1 以外の値を受け付けないというわけです。

代わりに .Items.Add / .Items.AddRange を使ってみてください。
 this.DisplayMember = "NAME";
 this.Items.AddRange(new DataView(this.Table).OfType<DataRowView>().ToArray<object>());
 this.SelectedIndex = 1;


もしくは、SelectedIndex の呼びだしを、親フォームの Load / Shown イベントで
行うようにするという手もあります。
引用返信 編集キー/
■76950 / inTopicNo.7)  Re[5]: コンボボックスで初期値の設定方法を教えてください。
□投稿者/ 魔界の仮面弁士 (474回)-(2015/08/31(Mon) 13:30:07)
No76948 (魔界の仮面弁士) に追記
> SelectedIndex の呼びだしを、親フォームの Load / Shown イベントで
> 行うようにするという手もあります。

// -------- 案1 --------
private void LoadItems()
{
  this.MakeTableColumnsName(new string[] { "NO", "NAME" });
  this.MakeTableAddRowDatas(new object[] { 1, "北海道" });
  this.MakeTableAddRowDatas(new object[] { 1, "青森" });
  this.DataSource = this.Table;
  this.DisplayMember = "NAME";
}

protected override void OnBindingContextChanged(EventArgs e)
{
  base.OnBindingContextChanged(e);
  int defaultIndex = 1; // ★
  this.SelectedIndex = Math.Min(defaultIndex, this.Items.Count - 1);
}


// -------- 案2 --------
private void LoadItems()
{
  this.MakeTableColumnsName(new string[] { "NO", "NAME" });
  this.MakeTableAddRowDatas(new object[] { 1, "北海道" });
  this.MakeTableAddRowDatas(new object[] { 1, "青森" });
  this.DataSource = this.Table;
  this.DisplayMember = "NAME";

  int defaultIndex = 1; // ★

  EventHandler select = null;
  select = delegate { if (this.Created) {
    this.SelectedIndex = Math.Min(defaultIndex, this.Items.Count - 1);
    this.VisibleChanged -= select;
  } };
  this.VisibleChanged += select;
}


// -------- 案3 --------
private void LoadItems()
{
  this.MakeTableColumnsName(new string[] { "NO", "NAME" });
  this.MakeTableAddRowDatas(new object[] { 1, "北海道" });
  this.MakeTableAddRowDatas(new object[] { 1, "青森" });
  this.DataSource = this.Table;
  this.DisplayMember = "NAME";

  int defaultIndex = 1;

  EventHandler select = null;
  select = delegate {
    this.SelectedIndex = Math.Min(defaultIndex, this.Items.Count - 1);
    Application.Idle -= select;
  };
  Application.Idle += select;
}
引用返信 編集キー/
■76961 / inTopicNo.8)  Re[6]: コンボボックスで初期値の設定方法を教えてください。
□投稿者/ ミーアキャット (11回)-(2015/08/31(Mon) 18:39:36)
No76950 (魔界の仮面弁士 さん) に返信

どうも、ありがとうございます。

>代わりに .Items.Add / .Items.AddRange を使ってみてください。
うまく動作しました。


>SelectedIndex の呼びだしを、親フォームの Load / Shown イベントで
>行うようにするという手もあります。

ごめんなさい。こちらの方は試してません。


今作ったのを@、とすると
もう一つコンボボックスAを作って、

Aの引数(プロパティ)で@を選択して@の値によって
AのItemsを自動的に変更するものを作ろうとしています。

なので、たぶんですけど
Load / Shown イベントで行うと、そのあたりのコードが
面倒になるような気がするのですけど気のせいでしょうか?


もちろんAの中に@のChangeItems イベントを作成してから
@が変更されるとAのItemsも変更できるようにしていきたいと
思っています。

説明が下手で理解できないかもしれませんが、
また、わからないことがあれば質問させていただきます
よろしくお願いします。

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



解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -