做的一个gridview 中,要求用户可以拖动列,只要设置属性就可以实现了,但是还有一功能就是要记录用户拖动的列顺序,下次程序开启,以最近一次设置为主,如何解决这个问题,请给点思路
我记录窗体大小那些信息全部是用XML文件,保存在本地的.
这个有什么办法吗?

解决方案 »

  1.   

    记录数据最后一次排列顺序到是好做,要记录控件的排列状态这没做过建议自己在HTML中划吧,在用JS完成拖动的特效,我想比你现在的功能要好实现的多
      

  2.   

    把列的顺序保存在本地一个配置文件列,xml就可以,加载时先读取文件,然后布置列
      

  3.   

    1楼:我做的winform程序,用不到js啊,
    2楼:我思路基本和你一样的,但是主要问题是怎么保存才是比较好的?假如现在保存在一个长字符串,等加载的时候解析,如何匹配呢?这也是个问题。
      

  4.   


    很简单的,拖动列后,将列的标题名和对应的列索引值保存到xml就行了xml可以用如下格式:
    <columns>
        <column>列名</column>
        <columid>indexid</columnid>
    </columns>读取数据的时候按照索引值大小排列列即可。正在MAC系统上做视频,等会儿做完了转到win系统下写个代码测试我的想法。个人感觉没问题呵呵
      

  5.   

    AllowUserToOrderColumns,是否允许用户拖动列
    记录displayIndex 给DGV列序变化事件写代码,改变DT的列序 
      

  6.   

    在做视频,下午才能到win系统下测试想法。感觉没问题呵呵
      

  7.   

     弱弱的问一句     DGV列序变化事件 是哪个???
      

  8.   

    在xml下记录一个字符串也行的呀,x,x,x,x这样的字符串都行,解析出来再布置也一样 的
      

  9.   


    不行,有问题!百度了一下,可能是微软的DisplayIndex有bug,程序虽然能排序能保存排序值,但是排序值和实际视图中的不同!回家后研究一下看看有无别的方案。
    这是今天下午测试的代码:using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Data.SqlClient;    //不解释,你懂的
    using System.Xml;               //因为要把列信息保存在xml中,因此要引用xml命名空间
    using System.Collections;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace 列排序
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        //定义数据集
            DataSet ds = new DataSet();
            //定义XML对象
            XmlDocument doc = new XmlDocument();
            //定义列索引值
            int j = 0;
            //定义列索引名
            string xml_data = string.Empty;
            private void Form1_Load(object sender, EventArgs e)
            {
                bind_data();
            }        //绑定数据方法
            private void bind_data()
            {
                try
                {
                    using (SqlConnection conn = new SqlConnection("data source=127.1; initial catalog=pubs; user id=sa;password=sa;"))
                    {
                        using (SqlDataAdapter da = new SqlDataAdapter("select * from sales", conn))
                        {
                            da.Fill(ds,"sales_DsTable");
                        }
                    }
                    dataGridView1.DataSource = ds.Tables["sales_DsTable"];
                    dataGridView1.AutoGenerateColumns = true;
                    doc.Load(Application.StartupPath + @"\columnsort.xml");
                    dataGridView1.Columns["stor_id"].DisplayIndex = int.Parse(doc.DocumentElement.SelectSingleNode("stor_id").InnerText);
                    dataGridView1.Columns["ord_num"].DisplayIndex = int.Parse(doc.DocumentElement.SelectSingleNode("ord_num").InnerText);
                    dataGridView1.Columns["ord_date"].DisplayIndex = int.Parse(doc.DocumentElement.SelectSingleNode("ord_date").InnerText);
                    dataGridView1.Columns["qty"].DisplayIndex = int.Parse(doc.DocumentElement.SelectSingleNode("qty").InnerText);
                    dataGridView1.Columns["payterms"].DisplayIndex = int.Parse(doc.DocumentElement.SelectSingleNode("payterms").InnerText);
                    dataGridView1.Columns["title_id"].DisplayIndex = int.Parse(doc.DocumentElement.SelectSingleNode("title_id").InnerText);
                }
                catch(Exception es)
                {
                    MessageBox.Show("读取数据失败,请检查数据连接或检索字符串是否有问题?"+es.ToString());
                }        }        private void button1_Click(object sender, EventArgs e)
            {
                j = 0;
                xml_data = "";
                //遍历顺序改变后列名,以构造字符串
                for (int i = 0; i < dataGridView1.Columns.Count; i++)
                {
                    j = dataGridView1.Columns[i].DisplayIndex;
                    xml_data += dataGridView1.Columns[j].Name + "    "+j+"        ,";
                }
                //去掉最后一个逗号
                xml_data = xml_data.Substring(0, xml_data.Length - 1);
                MessageBox.Show(xml_data);
                ////将列名信息保存到xml中。为什么使用xml捏?如果你的程序有很多类似的拖动列排序的应用,你可以将所有的表的列序保存到xml中,打开哪个表就从xml中检索哪个表的列序。比使用TXT文本好多了
                ////这里建议检查XML文档是否存在,如果不存在那么新建一个。我就不写了,自己完整吧。
                //doc.DocumentElement.SelectSingleNode("sales").InnerText = xml_data;
                //doc.Save(Application.StartupPath + @"\columnsort.xml");
                //Application.Restart();
            }        private void dataGridView1_ColumnDisplayIndexChanged(object sender, DataGridViewColumnEventArgs e)
            {        }
        }
    }
      

  10.   

    楼上,我记录了,解析出来,split成数组,然后赋值给DISplayIndex,但是问题好像顺序有点小问题...
      

  11.   


    对,就是这个问题。我到微软社区问了一下,很多人反应是DGV控件的DisplayIndex属性有问题。晚上一会儿看看能否用别的方法来搞定
      

  12.   

    如果DisplayIndex好用的话,就不需要数组了,下午想的方法更好、读/存XML文件更方便:
    若DisplayIndex好用的话,在拖动列事件中遍历列名,将列名按列顺序存储到XML文件中。从数据库提取数据的SQL语句用:select XML中列顺序 from 表   即可