做的一个gridview 中,要求用户可以拖动列,只要设置属性就可以实现了,但是还有一功能就是要记录用户拖动的列顺序,下次程序开启,以最近一次设置为主,如何解决这个问题,请给点思路
我记录窗体大小那些信息全部是用XML文件,保存在本地的.
这个有什么办法吗?
我记录窗体大小那些信息全部是用XML文件,保存在本地的.
这个有什么办法吗?
解决方案 »
- HttpListener能否监听https请求
- 请教:父窗体窗口菜单如何显示已打开的子窗体
- DateTimePicker的绑定问题
- 问个基础问题,关于try..catch..finally
- 高手帮忙,有关RC2CryptoServiceProvider加密问题
- 大家给点意见
- 200分:求英文字母、数字和汉字共同组成的字符串的截取方法!解决立马给分!
- C#中如何将一个截取String中的元素赋值给一个Int类型的数组
- 合并JS CSS的意义
- 寻求一个能够从本地读取远程服务器的cpu使用率和内存使用量程序或者参考资料
- WinForm窗体中边执行边显示怎么实现,就是执行循环的过程中显示
- 调用其他事件代码怎么写
2楼:我思路基本和你一样的,但是主要问题是怎么保存才是比较好的?假如现在保存在一个长字符串,等加载的时候解析,如何匹配呢?这也是个问题。
很简单的,拖动列后,将列的标题名和对应的列索引值保存到xml就行了xml可以用如下格式:
<columns>
<column>列名</column>
<columid>indexid</columnid>
</columns>读取数据的时候按照索引值大小排列列即可。正在MAC系统上做视频,等会儿做完了转到win系统下写个代码测试我的想法。个人感觉没问题呵呵
记录displayIndex 给DGV列序变化事件写代码,改变DT的列序
不行,有问题!百度了一下,可能是微软的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)
{ }
}
}
对,就是这个问题。我到微软社区问了一下,很多人反应是DGV控件的DisplayIndex属性有问题。晚上一会儿看看能否用别的方法来搞定
若DisplayIndex好用的话,在拖动列事件中遍历列名,将列名按列顺序存储到XML文件中。从数据库提取数据的SQL语句用:select XML中列顺序 from 表 即可