为了账号安全,请及时绑定邮箱和手机立即绑定

Visual Studio C# listview保存和加载问题

Visual Studio C# listview保存和加载问题

PHP
森林海 2024-01-20 21:16:30
我对 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)));        }    }问题是我已经激活了每个项目旁边的复选框。我无法保存选中复选框的列表视图项目。我想保存列表视图并加载所选项目。谢谢
查看完整描述

3 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

像这样的东西?:


        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);


查看完整回答
反对 回复 2024-01-20
?
万千封印

TA贡献1891条经验 获得超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++;





        }






    }



查看完整回答
反对 回复 2024-01-20
?
潇湘沐

TA贡献1816条经验 获得超6个赞

您需要保存更多信息,而不是仅保存字符串。您可以添加 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; }

}


查看完整回答
反对 回复 2024-01-20
  • 3 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信