none
ListViewの結果を別のウインドウに渡すことについて RRS feed

  • 質問

  • 回答者のみなさま、いつもお世話になっております。

    ListViewの結果を子ウインドウのリストビューに渡したいのですが、
    将来の仕様変更で、ListViewの列数が増える可能性があり、どのような
    変数渡しをすれば良いか悩んでおります。

    これについて、参考情報、よくやるやり方等、ガイドライン等を
    ご教示いただけないでしょうか。

    よろしくお願いします。


    2009年2月24日 14:30

回答

  • ListViewと言われてもSystem.Windows.FormsSystem.Windows.ControlsSystem.Web.UI.WebControlsの3つがありまして。
    勝手な想像で最初のものとして答えます。

    「ListViewの結果」という言葉が何を意味しているのか理解できませんでした。
    ListViewは表示手段であって何らか動作をするものではありませんので結果というものは存在しませんが…。
    選択結果、ListView.SelectedItemsとでも捉えればいいでしょうか?

    ともかくリスト1行分を表すクラスを用意してみてはどうでしょうか。
    リストの各カラムは表示の際にはstringになりますが、内部的には数値だったりenumだったりすることもありますので、元のデータを格納するという意味でもクラスは必要だと思います。
    その上で、ListViewItem.Tagにそのクラスインスタンスを入れておくとのちのち便利です。

    ListViewはListBoxと違ってDataSourceとか使えないんですよね。まぁListViewは複雑なので理解できますが。
    • 回答としてマーク sk7474 2009年3月10日 9:26
    2009年2月25日 0:20

すべての返信

  •  要求仕様がはっきり見えていないのですが、ListViewを丸ごと、つまりListViewの参照を渡したり、もし、ListViewがバインドしているのであれば、そのデータソースを渡したり、いろいろ考えられます。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月25日 0:14
    モデレータ
  • ListViewと言われてもSystem.Windows.FormsSystem.Windows.ControlsSystem.Web.UI.WebControlsの3つがありまして。
    勝手な想像で最初のものとして答えます。

    「ListViewの結果」という言葉が何を意味しているのか理解できませんでした。
    ListViewは表示手段であって何らか動作をするものではありませんので結果というものは存在しませんが…。
    選択結果、ListView.SelectedItemsとでも捉えればいいでしょうか?

    ともかくリスト1行分を表すクラスを用意してみてはどうでしょうか。
    リストの各カラムは表示の際にはstringになりますが、内部的には数値だったりenumだったりすることもありますので、元のデータを格納するという意味でもクラスは必要だと思います。
    その上で、ListViewItem.Tagにそのクラスインスタンスを入れておくとのちのち便利です。

    ListViewはListBoxと違ってDataSourceとか使えないんですよね。まぁListViewは複雑なので理解できますが。
    • 回答としてマーク sk7474 2009年3月10日 9:26
    2009年2月25日 0:20
  • 佐祐理さん の発言:

    ListViewはListBoxと違ってDataSourceとか使えないんですよね。まぁListViewは複雑なので理解できますが。

    うっかりしました。orz  フォローありがとうございます。
     
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    2009年2月25日 0:27
    モデレータ
  •  回答者の皆様、ご回答ありがとうございます。

    佐祐理様に質問ですが、幼稚な質問で大変恐縮ですが、
    ・リスト1行分を表すクラス
    ・ListViewItem.Tagの使い方
    の例を教えていただけないでしょうか。

    お忙しいところ恐縮ですが、よろしくお願いいたします。
    • 回答の候補に設定 girou2 2009年3月14日 5:55
    2009年2月25日 9:26
  •  こんにちは。中川俊輔 です。

    trapemiyaさん、佐祐理さん、回答ありがとうございます。

    なっぷさん、フォーラムのご利用ありがとうございます。
    有用な情報と思われたため、佐祐理さんの回答へ回答マークをつけさせていただきました。

    追加の質問については、なっぷさんが表示したい内容などがわからないで、例を出すのは難しいかと思います。

    今後ともフォーラムをよろしくお願いします。
    それでは!
    マイクロソフト株式会社 フォーラム オペレータ 中川 俊輔
    2009年3月10日 10:37
  • // すっごく簡単な例。  
    // 以下のようなレコード(名前、電話、メール)を用意し、  
        public class Record {  
          private string name_;  
          private string phone_;  
          private string mail_;  
          public string Name { get { return name_;} set { name_ = value; } }  
          public string Phone { get { return phone_;} set { phone_ = value; } }  
          public string Mail { get { return mail_;} set { mail_ = value; } }  
        }  
     
    // RecordからListViewItemを生成する拡張メソッドを用意すれば  
        public static class RecordExtension {  
          public static ListViewItem MakeLVItem(this Record rec) {  
                ListViewItem item = new ListViewItem(rec.Name);  
                item.SubItems.Add(new ListViewItem.ListViewSubItem(item, rec.Phone));  
                item.SubItems.Add(new ListViewItem.ListViewSubItem(item, rec.Mail));  
                item.Tag = rec; // ここで Tagに自身をセット  
                return item;  
          }  
        }  
     
    // Formでの"レコード追加ボタン"では  
            private void button1_Click(object sender, EventArgs e)  
            {  
                Record rec = new Record();  
                rec.Name = textBox1.Text;  
                rec.Phone = textBox2.Text;  
                rec.Mail = textBox3.Text;  
                listView1.Items.Add(rec.MakeLVItem()); // ListViewに追加  
            }  
     
    // ListViewの行が選択されたとき  
            private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)  
            {  
                Record rec = e.Item.Tag as Record; // Tagから Recordを取り出して  
                textBox1.Text = rec.Name; // TextBoxに表示する  
                textBox2.Text = rec.Phone;  
                textBox3.Text = rec.Mail;  
            }  
        }  
     
     

    επιστημη @わんくま同盟, Microsoft MVP Visual C++
    2009年3月13日 5:43