C# listview控件内的内容保存

如何比较方便快速的保存listview中的内容。比如保存下拉列表的所有内容,可以在setting.setting中加一个stringcollection类型的存储变量,然... 如何比较方便快速的保存listview中的内容。
比如保存下拉列表的所有内容,可以在setting.setting中加一个stringcollection类型的存储变量,然后使用Properties.Settings.Default带的方法即可保存数据。但是setting.setting默认可选数据类型没有适合listview的。请教如何保存和读取listview的全部内容。

注:如果能使用setting.setting保存最好,如果用xml或表格等方式保存读取请附示范代码(假设保存listview1的所有数据,读取数据并全部写入listview2中)。不仅保存读取显示的文本,包括每一个元素的名字,即name和text都需要保存读取,其他的字体什么的就没必要了。
如果有详尽的指导思路且我验证可行,将会接收答案。
如果解决方案比较好且有可用的示范代码,将额外加100悬赏。
展开
 我来答
makosharp
2016-09-15 · TA获得超过676个赞
知道小有建树答主
回答量:188
采纳率:100%
帮助的人:269万
展开全部

因为ListViewItem的所有属性都是可序列化的(包括SubItems),所以直接二进制序列化ListViewItem即可。为了方便保存,序列化得到的二进制流转为字符串,想存在什么地方都行。


下面给出序列化和反序列化方法以及示例代码:

        public IEnumerable<string> SerializeListViewItems(ListView listView)
        {
            var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            foreach (var item in listView.Items)
            {
                using (var ms = new MemoryStream())
                {
                    serializer.Serialize(ms, item);
                    yield return Convert.ToBase64String(ms.ToArray());
                }
            }
        }
        
        public IEnumerable<ListViewItem> DeserializeListViewItems(IEnumerable<string> itemStringList)
        {
            var serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            foreach (var item in itemStringList)
            {
                using (var ms = new MemoryStream(Convert.FromBase64String(item)))
                {
                    yield return serializer.Deserialize(ms) as ListViewItem;
                }
            }
        }

使用时:

            var list = SerializeListViewItems(listView1);
            var listView2 = new ListView();
            listView2.Width = listView1.Width;
            listView2.Height = listView1.Height;
            foreach (var item in DeserializeListViewItems(list))
            {
                listView2.Items.Add(item);
            }
            this.Controls.Add(listView2);


需要注意的几点:


ListViewItem可能被置有GroupKey和/或ImageListKey,在序列化反序列化之后得到的ListViewItem依然有这两项属性的值,但其并不会生效,原因在于listView2没有如同listView1的ImageList和Groups。


如果确实有需要,可以考虑将ImageList(包括图片)和Groups二进制序列化。当然,源listView的其他属性比如宽高等等也可以一并序列化带走。


此外,因为代码序列化了整个ListViewItem,所以包括字体前景色之类的信息都被带走了,反序列化后也能看见。


最后,如果你仅仅是想保存所有的ListViewItem(及其SubItems)的Name和Text,可以直接遍历并生成树状结构,转为xmlDocument或者json对象,之后存文件或者当做字符串写设置都可以。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式