- PR -

データテーブルの更新を、連結先のコンボボックスに反映する方法

1
投稿者投稿内容
kurage
会議室デビュー日: 2006/10/28
投稿数: 12
投稿日時: 2006-11-22 01:13
コンボボックスのデータソースにデータテーブルを連結し、
選択された行を一番上に移動したいのですが、上手く行きません。

たとえば、コンボボックスの▼をクリックしたとき
 数字0
 数字1
 数字2
 数字3
 数字4
と並んでいるとして、"数字3"が選択されたとすると、
 数字3
 数字0
 数字1
 数字2
 数字4
という状態にしたいのですが…。

以下のプログラムを実行すると、データテーブルの行位置の変更までは
上手くいっているようですが、
データソースの変更がコンボボックスに反映されません。
初歩的な質問かもしれませんが、よろしくお願い致します。

※データテーブルの行位置の変更方法につきましても、
 もっとスマートな方法があるような気がします…。
 方法をご存知の方がおられましたら、ご教示ください。

◆ソースコード
private void Form1_Load(object sender, System.EventArgs e)
{
  DataTable table = new DataTable();
  table.Columns.Add("Japanese", typeof(string));
  table.Columns.Add("English", typeof(string));
  for (int i = 0; i < 100; i++)
  {
    table.Rows.Add(new object[] {"数字" + i.ToString(), "Number" + i.ToString()});
  }
  comboBox1.DataSource = table;
  comboBox1.DisplayMember = "Japanese";
  comboBox1.ValueMember = "English";
}

private void comboBox1_Validated(object sender, System.EventArgs e)
{
  DataTable table = comboBox1.DataSource as DataTable;
  if (table != null)
  {
    // コンボボックスで選択された行をデータテーブルの一番上に移動する
    // ※もっとスマートな方法があるのでは・・・?
    DataRowView selectedRowView = (DataRowView)comboBox1.SelectedItem;
    DataRow selectedRow = selectedRowView.Row;
    DataRow row = table.NewRow();
    row.ItemArray = selectedRow.ItemArray;
    table.Rows.InsertAt(row, 0);
    table.Rows.Remove(selectedRow);

    // データソースの更新をコンボボックスに反映させたい(が、上手くいかない)
    comboBox1.DataSource = null;
    comboBox1.DataSource = table;
    comboBox1.DisplayMember = "Japanese";
    comboBox1.ValueMember = "English";

    comboBox1.SelectedIndex = 0;
  }
}

[ メッセージ編集済み 編集者: kurage 編集日時 2006-11-22 01:15 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-11-22 03:04
#別のコンボボックスに、じゃなくて同じコンボボックスに、でいいのですよね?

Validatedでやっても動かないような。。SelectionChangeCommittedあたりかな

データソースをいじれば事足ります。(comboBox1.DataSource = とかは不要)
たとえば、
コード:
private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
 DataTable table = comboBox1.DataSource as DataTable;
 DataRow newRow = table.NewRow();
 DataRow selectedRow = table.Rows[comboBox1.SelectedIndex];
 newRow.ItemArray = selectedRow.ItemArray;
 table.Rows.Remove(selectedRow);
 table.Rows.InsertAt(newRow, 0);
 comboBox1.SelectedIndex = 0;
}

kurage
会議室デビュー日: 2006/10/28
投稿数: 12
投稿日時: 2006-11-22 09:35
べるさん、ご回答ありがとうございます。

お教えくださった方法を試してみましたところ、
選択された項目が、一番上ではなく一番下に表示されてしまいます。

データテーブル内では、当該レコードが正しく一番上に移動している様子なのですが…。

<選択前>
数字0
数字1
数字2
数字3 ←選択
数字4

<選択後>
数字0
数字1
数字2
数字4
 …
数字99
数字3  ←一番下に表示されてしまう
_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-11-23 03:06
私の環境.NET2.0(VS2005)では正常に動いています。

引用:
お教えくださった方法を試してみましたところ、
選択された項目が、一番上ではなく一番下に表示されてしまいます。

そんなまさか;と思いましたが.NET1.1(VS2003)では確かに下に表示されました。。
環境が書いてないですが1.1なのですかね。

最後に
table.AcceptChanges();
を加えたら上に表示されました。(理由は深く調べてないのですが。。)
kurage
会議室デビュー日: 2006/10/28
投稿数: 12
投稿日時: 2006-11-23 11:52
引用:

私の環境.NET2.0(VS2005)では正常に動いています。

環境が書いてないですが1.1なのですかね。



すみません、環境を書くべきでしたよね…。
ご推測の通り、NET1.1(VS2003)です。

最後に table.AcceptChanges(); を付け加える方法で、
解決することができました(^^)ありがとうございました。
1

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