C#ListView操作一二

C#ListView的操作,MSDN文档已经说的比较详细,但是自己这两天在做一个小工具的时候发现还是有很多人在问跟我遇到的类似的问题:如何删除一列?将某一列删除后,重新导出数据如何才能正确?鉴于此,将自己的方式共享出来(c#小弟基本上没有怎么用过,只是简单了解,勿拍砖,小弟专注于移动安全、PC安全,欢迎交流:4014878)

 

删除一列

删除一列的操作,是在listView.Columns.Remove*这三个函数上,实际操作过程中,这三个函数仅仅是从UI上将对应的列隐藏起来了,在内存中,数据并未发生变化。

删除一列,可以增加一个对LitView的ColumnClick事件做一个处理:

listViewData.ColumnClick += new ColumnClickEventHandler(OnColumnClicked);
 private void OnColumnClicked(object sender, ColumnClickEventArgs e)
        {
            DialogResult  result = MessageBox.Show(this,"是否要删除该列?","提示",MessageBoxButtons.YesNo);
            if (result == DialogResult.Yes)
            {
                int n = e.Column+1;
                listViewData.Columns.RemoveByKey(Convert.ToString(n));

                int rows = listViewData.Items.Count;
                int nColumns = 0;
                for(int i=0;i<rows;i++)
                {
                    nColumns = listViewData.Items[i].SubItems.Count;
                    if (nColumns < n) continue;
                    listViewData.Items[i].SubItems.RemoveAt(e.Column);
                }
            }
        }

大家可能已经看到了,在调用了RemoveByKey之后,还对内存中的数据做了一次数据,至此,整个列的删除,才算完成。

网上也有一些关于如何删除一列的讨论,实际上我个人觉得真心没啥必要搞的那么复杂。

 

另一个就是根据文本内容动态增加一个ListView控件,先初始化一个ListView:

 private void createInitListControl()
        {
            if (listViewData == null)
            {
                listViewData = new ListView();
                listViewData.SetBounds(5, 65, groupBox1.Width, this.ClientSize.Height - groupBox1.Height - 15);
                listViewData.GridLines = true;//表格是否显示网格线
                listViewData.FullRowSelect = true;//是否选中整行
                listViewData.View = View.Details;//设置显示方式
                listViewData.Scrollable = true;//是否自动显示滚动条
                listViewData.MultiSelect = false;//是否可以选择多行
                listViewData.ColumnClick += new ColumnClickEventHandler(OnColumnClicked);
            }
            
        }

然后在Form的构造方法中调用

 public Form1()
        {
            InitializeComponent();
            createInitListControl();
        }

对于事件的绑定,一定要在初始化方法中完成,否则控件不会响应对应的事件。

 

至于如何重新导出数据,就更加简单了:

 private void buttonExport_Click(object sender, EventArgs e)
        {
            Stream myStream;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();

            saveFileDialog1.Filter = "txt files   (*.txt)|*.txt";
            saveFileDialog1.FilterIndex = 2;
            saveFileDialog1.RestoreDirectory = true;
            int nRows = 0;
            string text = "";
            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                if ((myStream = saveFileDialog1.OpenFile()) != null)
                {
                    using (StreamWriter sw = new StreamWriter(myStream))
                    {
                        nRows = listViewData.Items.Count;
                        for (int i = 0; i < nRows; i++)
                        {
                            for (int j = 0; j < listViewData.Items[i].SubItems.Count; j++)
                            {
                                text += listViewData.Items[i].SubItems[j].Text;
                                if (j < listViewData.Items[i].SubItems.Count - 1)
                                    text += "----";
                            }

                            text += "\r\n";
                        }
                        sw.Write(text);
                    }
                    myStream.Close();
                    MessageBox.Show("保存成功");
                }
            }
        }

 


版权声明:本文为u014518766原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。