2009-02-27 14 views
1

...または管理するC#listviews本当に悪夢ですか?ListViewの選択イベント処理で何か不足しています

私が取り組んでいる問題は非常に簡単です。または少なくともそれはそうであるように見えます:

私は別々の行に顧客の注文に関する情報を含むテキストファイルを持っています。データ項目はセミコロンで区切られています。

私のフォームはこれらの注文を反復し、アイテム情報をハッシュテーブルに入れ、各ハッシュテーブルをマスターハッシュテーブルに入れます。各注文(商品/注文番号/顧客名/顧客番号)に関するいくつかのサマリー情報が、ソート可能な列で区切られたリストビューに表示されます。リストビューの下には、3つのタブにまたがる注文詳細の編集可能部分のテキストボックスを含むタブコントロールがあります。ここで

は私が起こるしたいものです。

  • ユーザーは単一のエントリをクリック:タブコントロールのテキストボックスには、注文の詳細を記入してください。
  • ユーザーがタブコントロールの詳細を編集します。
  • ユーザーが別の注文をクリックする:確認メッセージが変更をコミットするかどうかをチェックし、「はい」の場合、詳細を関連するHashtableに保存し、リストビューの表示を更新します。
  • ユーザーは複数のリストビュー項目を選択します。先頭の項目はタブコントロールで編集可能です。
  • フォームの上部にあるツールストリップの[アイテムを削除]ボタンを押します。アイテムがハッシュテーブルから削除され、リストビューコントロールが更新されて削除が反映されます。テキストボックスは、タブコントロール全体で空白に設定されています。

これは私にはかなり普通で妥当な動作のようです。私は、SelectedIndexChangedイベントを使用すると、データ作業を行う機会を提供するだろうと推測しました。しかし、イベントはすべての選択/選択解除で2回発生し、どの項目をリストビューで更新する必要があるかは必ずしも明確ではありません。

どのような「選択/選択解除」が行われたかをテストし、どのようなアクションを取るべきかを決定するコードはかなり長くなり始めています。

ので:

  • は、私は私の機能の目標を達成するために使用できる別のイベントはありますか?または
  • SelectedIndexChangedイベントについて、プログラムが特定の時点で何をすべきかを決定するのに役立つかどうかわかりませんか?または
  • 私はこれについて間違った方法をとっていますか?

私のフォームを再設計することについてのご意見、ご提案は大歓迎です。

EDIT:この問題を別の角度から攻撃しようとしている間、私はマスターハッシュテーブルをソートリストに変更しています。残りの問題は同じままです。

Listview1.MultiSelectがfalseであることを確認してください:私は次のことを示唆している「非常に長い取得し始め」のコードを知らなくても

+0

は、このWPFまたはWinformsですか? – Gishu

答えて

0

。 フォーム上のフィールド(またはプロパティ)を使用してSelectedItemを追跡します。 新しいListView1.Selecteditems [0]!= this.SelectedItemがあるかどうかを確認してください。

パート2:代替ソリューションとしてDataGridViewとDataTablesを見てください。あなたのデータはかなり「リレーショナル」と聞こえて、データには多くのフィルタリング/並べ替え/リンク機能があります。 DataSourceとしてListをグリッドに接続するか、もう少し進んでデータをDataTableに読み込むことができます。

+0

複数選択は私が恐れている必要があります。データの90%を失いたくて、90個のレコードを個別に削除しなければならないこともあります。しかし、単一のデータテーブルが良いアイデアかもしれません。私はそれを調べます。 –

+0

えええええええええええええええええええええええええええええええええええええええええええええ投稿者:どうもありがとう。 –

0

代わりSelectedIndexChangedListViewに発射されたときにUIを更新するので、短いDuration(たとえば、デフォルトの100ミリ秒)でTimerを開始し、Timer.TickハンドラでUIの更新を行います。

例えば:

  1. ドラッグListViewTimer
  2. あなたのWinFormの上にデザイナー
  3. を使用してListViewへのアイテムの選択を追加ListViewさんSelectedIndexChangedイベントのハンドラを追加し、TimerTickイベント
  4. 既存コードを次のように置き換えます。

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    timer1.Start(); 
} 

private string GetIndices() 
{ 
    string indices = ""; 
    foreach (int i in listView1.SelectedIndices) 
    { 
     indices += i.ToString() + ", "; 
    } 

    if (indices.Length > 0) 
    { 
     indices = indices.Substring(0, indices.Length - 2); 
    } 

    return indices; 
} 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    timer1.Stop(); 
    Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss.fff") + 
     ". Selected indices = " + GetIndices()); 
} 

選択解除および再選択のイベントは相互に非常に近い連続して来るので、これは動作します - TimerDurationよりも速く。このようにTimerを使用すると、そのペアは単一の複合イベントとして扱われます。

こちらがお役に立てば幸いです。

+0

私はそれがなぜ1回のクリックで2回発生するのか理解しています。いったん現在の選択を解除し、新しい選択を選択すると、Googleの検索は、これを説明する結果で盛り込まれます。少なくとも、これは私に通知されたものです... –

+0

私の前の例では申し訳ありません。私は元のエントリを修正し、これがより適切であることを願っています。 –

関連する問題