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

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

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

listviewについて

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

■88978 / inTopicNo.1)  listviewについて
  
□投稿者/ わたー (4回)-(2018/10/23(Tue) 13:40:07)

分類:[C#] 

2018/10/23(Tue) 13:47:57 編集(投稿者)

連続で質問失礼します。

テキストボックスに文字列を入力して登録ボタンを押すとlistviewに値が入るようなプログラムがあったとします。

例: 14時00分     田中太郎    男
という風にテキストボックス3つに情報を入れて「登録ボタン」を押す。

 ↓   ↓   ↓   ↓

|時刻 |名前 |性別 |
|14時00分 |田中太郎 |男 |
|・・・・ |・・・・・・ |・・・|

という風なlistviewデータを投入します。
その後15時00分・・伊藤太郎 女  ・・・・という風に続けてデータを入れます。

その後、このlistviewに入ったデータを「UserData」みたいな名前の一つのデータとして扱うことはできますか?

例えばlistviewの値をクリアしてもUserDataを代入すればデータがまるまる復旧するようなことができるか  です。
引用返信 編集キー/
■88982 / inTopicNo.2)  Re[1]: listviewについて
□投稿者/ 魔界の仮面弁士 (1885回)-(2018/10/23(Tue) 14:15:08)
2018/10/23(Tue) 14:16:38 編集(投稿者)

No88978 (わたー さん) に返信
> 登録ボタンを押すとlistviewに値が入るようなプログラムがあったとします。
ListView の詳細モードですね。


> その後、このlistviewに入ったデータを「UserData」みたいな名前の一つのデータとして扱うことはできますか?
手順が逆です。
データはまず UserData として管理しておき、その内容を ListView に表示するようにします。


また、ListView ありきで考えるのであれば、
 public class UserData : ListViewItem
 {
 }
のようにしておくのも手です。

そうすれば、この UserData クラスをそのまま ListView に登録できますし、
ListView の SelectedItems プロパティからの戻り値をキャストすれば、
そのまま UserData として取り扱うこともできます。
 
別案としては、UserData と ListViewItem を相互に変換できるよう
拡張メソッドを設けるという手もあるかと思います。
引用返信 編集キー/
■88984 / inTopicNo.3)  Re[1]: listviewについて
□投稿者/ 魔界の仮面弁士 (1887回)-(2018/10/23(Tue) 15:21:48)
No88978 (わたー さん) に返信
> その後、このlistviewに入ったデータを「UserData」みたいな名前の一つのデータとして扱うことはできますか?
> UserDataを代入すればデータがまるまる復旧するようなことができるか  です。

丸ごと渡したいなら、 No88982 の案でどうでしょう。


※ C# 7.x + .NET Framework 4.7.x で動作確認

// 予約情報
public class UserData : ListViewItem
{
  public DateTime Schedule { get; }
  public DateTime Date { get => Schedule.Date; }
  public string TimeText { get => Schedule.ToString(@"HH\時mm\分"); }
  public string UserName { get; set; }
  public string Gender { get; set; }

  public UserData(DateTime schedule, string userName, string gender)
  {
    (Schedule, UserName, Gender) = (schedule, userName, gender);
    Text = TimeText;
    SubItems.Add(userName).Name = "名前";
    SubItems.Add(gender).Name = "性別";
  }
}


// 予約の一覧
private List<UserData> list = new List<UserData>();

// ListView を更新
private DateTime selectedDay;
private void RefreshView(DateTime newDay)
{
  selectedDay = newDay;
  listView1.BeginUpdate();
  listView1.Items.Clear();

  // UserData は ListViewItem を継承しているので、
  // List<UserData> を LINQ で配列に抽出すれば、そのまま AddRange に渡せる
  listView1.Items.AddRange(list.Where(v => v.Date == selectedDay).ToArray());

  listView1.EndUpdate();
}

private void Form1_Load(object sender, EventArgs e)
{
  listView1.View = View.Details;
  listView1.FullRowSelect = true;
  listView1.MultiSelect = false;
  listView1.Columns.Clear();
  listView1.Columns.Add("時刻");
  listView1.Columns.Add("名前");
  listView1.Columns.Add("性別");

  list.Add(new UserData(new DateTime(2018, 10, 23, 14, 0, 0), "田中太郎", "男"));
  list.Add(new UserData(new DateTime(2018, 10, 23, 15, 0, 0), "わたー", "n/a"));
  list.Add(new UserData(new DateTime(2018, 10, 30, 15, 0, 0), "鈴木一郎", "男"));
  list.Add(new UserData(new DateTime(2018, 10, 30, 16, 0, 0), "田中太郎", "男"));

  RefreshView(new DateTime(2018, 10, 23));
}

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
  var items = listView1.SelectedItems;
  if (items.Count == 0)
  {
    label1.Text = "";
    label2.Text = "";
  }
  else
  {
    // 選択行の情報は、ListViewItem からそのまま取り出しても良いし
    var listItem = items[0];
    label1.Text = listItem.Text + ";" + listItem.SubItems["名前"].Text + ";" + listItem.SubItems["性別"].Text;

    // UserData にキャストしてから扱うこともできる
    var userData = (UserData)listItem;
    label2.Text = userData.TimeText + ";" + userData.UserName + ";" + userData.Gender;
  }
}
引用返信 編集キー/
■88985 / inTopicNo.4)  Re[2]: listviewについて
□投稿者/ わたー (6回)-(2018/10/24(Wed) 08:55:50)
No88984 (魔界の仮面弁士 さん) に返信
> ■No88978 (わたー さん) に返信
>>その後、このlistviewに入ったデータを「UserData」みたいな名前の一つのデータとして扱うことはできますか?
>>UserDataを代入すればデータがまるまる復旧するようなことができるか  です。
>
> 丸ごと渡したいなら、 No88982 の案でどうでしょう。
>
>
> ※ C# 7.x + .NET Framework 4.7.x で動作確認
>
> // 予約情報
> public class UserData : ListViewItem
> {
>   public DateTime Schedule { get; }
>   public DateTime Date { get => Schedule.Date; }
>   public string TimeText { get => Schedule.ToString(@"HH\時mm\分"); }
>   public string UserName { get; set; }
>   public string Gender { get; set; }
>
>   public UserData(DateTime schedule, string userName, string gender)
>   {
>     (Schedule, UserName, Gender) = (schedule, userName, gender);
>     Text = TimeText;
>     SubItems.Add(userName).Name = "名前";
>     SubItems.Add(gender).Name = "性別";
>   }
> }
>
>
> // 予約の一覧
> private List<UserData> list = new List<UserData>();
>
> // ListView を更新
> private DateTime selectedDay;
> private void RefreshView(DateTime newDay)
> {
>   selectedDay = newDay;
>   listView1.BeginUpdate();
>   listView1.Items.Clear();
>
>   // UserData は ListViewItem を継承しているので、
>   // List<UserData> を LINQ で配列に抽出すれば、そのまま AddRange に渡せる
>   listView1.Items.AddRange(list.Where(v => v.Date == selectedDay).ToArray());
>
>   listView1.EndUpdate();
> }
>
> private void Form1_Load(object sender, EventArgs e)
> {
>   listView1.View = View.Details;
>   listView1.FullRowSelect = true;
>   listView1.MultiSelect = false;
>   listView1.Columns.Clear();
>   listView1.Columns.Add("時刻");
>   listView1.Columns.Add("名前");
>   listView1.Columns.Add("性別");
>
>   list.Add(new UserData(new DateTime(2018, 10, 23, 14, 0, 0), "田中太郎", "男"));
>   list.Add(new UserData(new DateTime(2018, 10, 23, 15, 0, 0), "わたー", "n/a"));
>   list.Add(new UserData(new DateTime(2018, 10, 30, 15, 0, 0), "鈴木一郎", "男"));
>   list.Add(new UserData(new DateTime(2018, 10, 30, 16, 0, 0), "田中太郎", "男"));
>
>   RefreshView(new DateTime(2018, 10, 23));
> }
>
> private void listView1_SelectedIndexChanged(object sender, EventArgs e)
> {
>   var items = listView1.SelectedItems;
>   if (items.Count == 0)
>   {
>     label1.Text = "";
>     label2.Text = "";
>   }
>   else
>   {
>     // 選択行の情報は、ListViewItem からそのまま取り出しても良いし
>     var listItem = items[0];
>     label1.Text = listItem.Text + ";" + listItem.SubItems["名前"].Text + ";" + listItem.SubItems["性別"].Text;
>
>     // UserData にキャストしてから扱うこともできる
>     var userData = (UserData)listItem;
>     label2.Text = userData.TimeText + ";" + userData.UserName + ";" + userData.Gender;
>   }
> }
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ