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

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

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

Re[6]: リストボックスのソート処理


(過去ログ 11 を表示中)

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

■2020 / inTopicNo.1)  リストボックスのソート処理
  
□投稿者/ けい (4回)-(2007/03/14(Wed) 10:23:35)

分類:[C# (Windows)] 

お世話になっております。

C#で開発を行っているのですがリストボックスの
ソート処理についてご質問させてください。


リストボックスを二つ用意してリストボックスのプロパティでSortはTrueにしています。

1.左のリストボックスにDBから取得した値(この時主キーでOrderByでソート)を表示しています。
左リスト 右リスト
00001
00002 
00003

2.左のリストでデータを選択して、追加ボタンを押下した際に
  選択した行に対してリムーブとアッド行い、右のリストボックスに移動させます。(先頭行の場合)

左のリスト 右のリスト
00002  → 00001
00003

3.右のリストに移動した値を選択して、削除ボタンを押下した際に
  追加と同様にリムーブとアッドを行い、左のリストボックスに移動させます。
左リスト 右リスト
00001
00002 
00003

リストボックスのソートプロパティで見た目上は問題ないのですが、ここから更に2の操作を行うと
先頭の00001を選択したのにも関わらず右のリストボックスには00002が表示されてしまいます。
※ソートプロパティを使用しなければ見た目はソートされませんが選択した値を移動します。

恐らくaddとRemoveの処理で配列のIndexがずれてしまったのではないかと思うのですが
ずらさずにソートを行う方法があったらご教授の方宜しくお願い致します。


  
引用返信 編集キー/
■2021 / inTopicNo.2)  Re[1]: リストボックスのソート処理
□投稿者/ επιστημη (438回)-(2007/03/14(Wed) 10:40:51)
επιστημη さんの Web サイト
> リストボックスのソートプロパティで見た目上は問題ないのですが、ここから更に2の操作を行うと
> 先頭の00001を選択したのにも関わらず右のリストボックスには00002が表示されてしまいます。

再現できません。ちゃんと期待通りに動作します。

    // 左から右へ
    private void LtoR_Click(object sender, EventArgs e) {
      int index = leftBox.SelectedIndex;
      if ( index >= 0 ) {
        rightBox.Items.Add(leftBox.SelectedItem);
        leftBox.Items.RemoveAt(index);
      }
    }

    // 右から左へ
    private void RtoL_Click(object sender, EventArgs e) {
      int index = rightBox.SelectedIndex;
      if ( index >= 0 ) {
        leftBox.Items.Add(rightBox.SelectedItem);
        rightBox.Items.RemoveAt(index);
      }
    }

引用返信 編集キー/
■2022 / inTopicNo.3)  Re[2]: リストボックスのソート処理
□投稿者/ けい (6回)-(2007/03/14(Wed) 11:58:30)
> // 左から右へ
> private void LtoR_Click(object sender, EventArgs e) {
> int index = leftBox.SelectedIndex;
> if ( index >= 0 ) {
> rightBox.Items.Add(leftBox.SelectedItem);
> leftBox.Items.RemoveAt(index);
> }
> }
>
> // 右から左へ
> private void RtoL_Click(object sender, EventArgs e) {
> int index = rightBox.SelectedIndex;
> if ( index >= 0 ) {
> leftBox.Items.Add(rightBox.SelectedItem);
> rightBox.Items.RemoveAt(index);
> }
> }
>
επιστημηさん
お早い返信ありがとうございます。
教えて頂いたソースを試して見たところ
「データソースプロパティを設定した時はItemsコレクションを変更することはできません。」
と表示されました。

現在
dsListR.Tables["code"].Rows.Add(rightRow);
dsListL.Tables["code"].Rows.Remove(leftRow);
と言う記述なのですが、教えて頂いたやり方では出来ませんでした。

データソースを使用している際は、Items.AddとRemoveは使用出来ないのでしょうか?
説明がわかりにくくて申し訳ございませんが、宜しくお願い致します。

引用返信 編集キー/
■2023 / inTopicNo.4)  Re[3]: リストボックスのソート処理
□投稿者/ シャノン (108回)-(2007/03/14(Wed) 12:56:07)
シャノン さんの Web サイト
No2022 (けい さん) に返信
> データソースを使用している

そういうことは先に言う。
で、ソートには DataView を使ってる?

DataView をソートしても、DataTable 内の行の順番は変わりません(DataTable はソートされない)。
そのため、ListBox の行番号と DataTable の行番号が一致しくなります。
その整合性を取るカラクリを考えましょう。

> Items.AddとRemoveは使用出来ないのでしょうか?

エラーメッセージにも書いてある通り、できません。
代わりに、今やっているように DataTable の行を追加・削除するか、DataView で非表示にしましょう。
引用返信 編集キー/
■2024 / inTopicNo.5)  Re[4]: リストボックスのソート処理
□投稿者/ けい (7回)-(2007/03/14(Wed) 13:37:26)
> で、ソートには DataView を使ってる?
DataViewは使用していません。
今はListBoxのプロパティのSortをTrueにしているだけです。

> DataView をソートしても、DataTable 内の行の順番は変わりません(DataTable はソートされない)。
> そのため、ListBox の行番号と DataTable の行番号が一致しくなります。
> その整合性を取るカラクリを考えましょう。

>>Items.AddとRemoveは使用出来ないのでしょうか?
>
> エラーメッセージにも書いてある通り、できません。
> 代わりに、今やっているように DataTable の行を追加・削除するか、DataView で非表示にしましょう。

アドバイスありがとうございました。

引用返信 編集キー/
■2025 / inTopicNo.6)  Re[5]: リストボックスのソート処理
□投稿者/ 魔界の仮面弁士 (257回)-(2007/03/14(Wed) 16:25:46)
No2024 (けい さん) に返信

選択された内容を取得するときに、SelectedIndex を使っていませんか?

DataRowView rowView = listBox1.SelectedItem as DataRowView;
if (rowView == null) {
    label1.Text = "";
} else {
    label1.Text = rowView.Row["Col1"].ToString();
}


int index = listBox1.SelectedIndex;
if (index < 0) {
    label2.Text = "";
} else {
    label2.Text = dataTable1.Rows[index]["Col1"].ToString();
}

引用返信 編集キー/
■2027 / inTopicNo.7)  Re[6]: リストボックスのソート処理
□投稿者/ けい (8回)-(2007/03/14(Wed) 20:28:12)
皆様のおかげで無事処理が出来ました。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -