【问题标题】:visual studio C# listview save and load problemvisual studio C# listview 保存和加载问题
【发布时间】:2019-09-30 23:33:10
【问题描述】:

我在使用 Visual Studio C# listview 项目时遇到问题,我无法通过谷歌搜索找到解决方案。

我用列表视图制作了应用程序,我可以添加、删除、更新列表视图项目。 我正在使用以下代码正确地保存和加载列表视图到文件/从文件中加载:

 private void saveListViewItems(string path, ListView lv)
    {
        var delimeteredListviewData = new List<string>();
        string delimeteredItems = string.Empty;

        foreach (ListViewItem lvi in lv.Items)
        {

            foreach (ListViewItem.ListViewSubItem lvsi in lvi.SubItems)
            {

                    delimeteredItems += lvsi.Text + "#";

            }
            delimeteredListviewData.Add(delimeteredItems);
        }


        System.IO.File.WriteAllLines(path, delimeteredListviewData.ToArray());
    }

    private void loadListViewItems(string path, ListView lv)
    {

        foreach (string line in System.IO.File.ReadAllLines(path))
        {
            lv.Items.Add(new ListViewItem(line.Split(new char[] { '#' }, StringSplitOptions.RemoveEmptyEntries)));

        }
    }

问题是我已激活每个项目旁边的复选框。我无法在选中复选框的情况下保存列表视图项目。我想保存列表视图并加载所选项目。谢谢

【问题讨论】:

  • 您可以将项目以具有checkedstate,from,to,comment 的每一行的格式保存到文件中,并通过解析加载。所以你可以实现方法SaveListBox(ListView sender, string filename)LoadListBox(ListView sender, string filename),你可以使用Split(',')
  • 感谢回复,但我需要一个完整的解决方案

标签: c# visual-studio listview checkbox


【解决方案1】:

像这样?:

        List<string> delimeteredItems = new List<string>();
        foreach (ListViewItem lvi in listView1.CheckedItems)
        {
            string     item= String.Join("#", lvi.SubItems.Cast<ListViewItem.ListViewSubItem>().Select(si=>si.Text));
            delimeteredItems.Add(item);
        }
        System.IO.File.WriteAllLines(@"c:\temp\lines.txt", delimeteredItems);

【讨论】:

    【解决方案2】:

    您需要保存更多信息,而不是只保存字符串。 您可以将 IsChecked 值与您的字符串一起添加。 您需要一个将两个值都保存为属性的小型包装类。

    然后你可以使用序列化,它是一个术语,用于描述一种将对象转换为可以存储在磁盘上的东西的方法。

    有多种格式可供选择,但 Json 是一种可读性好的格式。您可以通过 nuget 包管理器下载 Nuget 包 NewtonSoft.Json。

    public class StoreListView
    {
        public void StoreToDisk(string path, List<ItemDataHolder> list)
        {
    
            string theListInJsonFormat = JsonConvert.SerializeObject(list);
    
            File.WriteAllText(path, theListInJsonFormat);
        }
    }
    
    public class ItemDataHolder
    {
        public string SomeValuesYouWantToSave { get; set; }
        public bool IsChecked { get; set; }
    }
    

    【讨论】:

      【解决方案3】:

      我已管理该程序以正常工作。 我对读取/写入文本文件的方式有误。 现在我正在使用 ini-parser nuget。

      已将 ini 解析器安装到项目中。 那么:

      使用 IniParser;

      使用 IniParser.Model;

       private void saveListViewItems(string path, ListView lv)
          {
              int i = 0;
              string IPFrom;
              string IPFromval;
              string IPTO;
              string IPTOval;
              string Comment;
              string Commentval;
              string CheckState;
              string CheckStateval;
              int IPSectioncount;
      
              var parser = new FileIniDataParser();
              IniData data = parser.ReadFile(path);
      
      
      
                      while ( i < lv.Items.Count) {
      
                          if ((lv.Items[i].Selected) || (lv.Items[i].Checked))
                          {
                              CheckStateval = "1";
                          }
                          else
                          {
                              CheckStateval = "0";
                          }
      
                      CheckState = "";
                      CheckState = "CheckState";
                      CheckState += String.Join(CheckState, i);
                      IPFromval = lv.Items[i].SubItems[0].Text;
      
                      IPFromval = "";
                      IPFrom = "IPFrom";
                      IPFrom += String.Join(IPFrom, i);
                      IPFromval = lv.Items[i].SubItems[0].Text;
      
                      IPTOval = "";
                      IPTO = "IPTO";
                      IPTO += String.Join(IPTO, i);
                      IPTOval = lv.Items[i].SubItems[1].Text;
      
                      Commentval = "";
                      Comment = "Comment";
                      Comment += String.Join(Comment, i);
                      Commentval = lv.Items[i].SubItems[2].Text;
      
      
      
      
                      data["IP"][CheckState] = CheckStateval;
                      data["IP"][IPFrom] = IPFromval;
                      data["IP"][IPTO] = IPTOval;
                      data["IP"][Comment] = Commentval;
      
      
      
                      i++;
                      }
      
      
                      IPSectioncount = lv.Items.Count;
                      data["IP"]["IPSectionCount"] = IPSectioncount.ToString();
                      parser.WriteFile(path, data);
      
      
          }
      
      
          private void loadListViewItems(string path, ListView lv)
          {
              string IPFrom;
              string IPTO;
              string Comment;
              string CheckState;
              string IPSectioncount;
              string row="";
      
      
      
              var parser = new FileIniDataParser();
              IniData data = parser.ReadFile(path);
      
              IPSectioncount = data["IP"]["IPSectionCount"];
              int m = Int32.Parse(IPSectioncount);
      
      
      
              int i = 0;
      
      
              while ( i < m )
              {
                  IPFrom = "";
                  IPTO = "";
                  Comment = "";
                  row = "";
      
      
                  IPFrom = "IPFrom";
                  IPFrom += String.Join(IPFrom, i);
                  IPFrom = data["IP"][IPFrom];
      
      
                  IPTO = "IPTO";
                  IPTO += String.Join(IPTO, i);
                  IPTO = data["IP"][IPTO];
      
      
                  Comment = "Comment";
                  Comment += String.Join(Comment, i);
                  Comment = data["IP"][Comment];
      
                  CheckState = "CheckState";
                  CheckState += String.Join(CheckState, i);
                  CheckState = data["IP"][CheckState];
      
                  row = String.Join(",",IPFrom,IPTO,Comment);
      
      
                                  lv.Items.Add(new ListViewItem(row.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)));
      
                                  if (CheckState == "1")
                                  {
                                      lv.Items[i].Checked = true;
                                  }
      
      
      
                      i++;
      
      
      
      
              }
      
      
      
      
      
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多