您的位置:首页 > 其它

DataSet&ListView分页和根据自己需要读取列数据,根据需要排列显示的位置或者可以说是顺序.[winform学习示例]

2011-11-26 21:54 525 查看
DataSet&ListView分页和根据自己需要读取列数据,根据需要排列显示的位置或者可以说是顺序.[winform学习示例]

为了ListView分页和有选择地排列数据列的位置(有时数据库列的位置与需要显示的位置排列不同或有些列不需要显示出来)在网络上找了一天时间,看了很多网页,看得我头痛眼睛累人烦,有的很粗略,有的过于冗长,有的看不懂,也说的不具体,令初学的人摸不着头脑;最终还是自己分析代码,终于找到了解决的方法,共享出来或许有人需要,可以参考和少走弯路。

网络上找到的ListView绑定数据库的例子:(如何连接数据库及把表读到DataSet就忽略了,以下代码是DataSet已经有数据的情况。)

DataTable dt = myDataSet.Tables[0];

foreach (DataRow row in dt.Rows)

{

string[] subitems = new string[?];//这个原来哪里找的现在找不到了!待找到改一下

object[] ? = row.ItemArray;

for (int i = 0; i < ?; i++)

{ subitems[i] = ?[i].ToString(); }

ListViewItem item = new ListViewItem(subitems);

ListView1.Items.Add(item);

}

我需要解决2个问题,下面分别阐述如何一步一步调试和修改.

1、根据自己需要读取列数据,根据需要排列显示的位置或者可以说是顺序,修改后的代码如下:

解决的方法就是去掉FOR循环,改为固定读取某列的数据,并按照自己需要安排排列顺序。

DataTable dt = myDataSet.Tables[0];

foreach (DataRow row in dt.Rows)

{

string[] subitems = new string[Lies];

object[] Han = row.ItemArray;

subitems[0] = Han[6].ToString();//在

subitems[1] = Han[7].ToString();//这

subitems[2] = Han[1].ToString();//修

subitems[3] = Han[2].ToString();//改

ListViewItem item = new ListViewItem(subitems);

ListView1.Items.Add(item);

item.ImageIndex = 13;//添加图标

}

以上解决了第一个问题。

2、运行后发现显示数据比较慢,那么,首先想到的就是分页,网络上找一天茫然无绪,有一大堆网页,不是很长,就是寥寥几字,唉。。。。。。,有的说用SQL来实现,有的说改造ListView,还有的只说用bindingNavigator1和bindingSource1结合使用是个不错的,可结果都找不到例子来参考,最后只能放弃,想另外采取措施。

后来在不断思考和调试中发现,只有设定一定的条件限制就可以实现分页问题,于是,做如下修改:

int FenYe = 0;

DataTable dt = myDataSet.Tables[0];

foreach (DataRow row in dt.Rows)

{

FenYe++; //

string[] subitems = new string[Lies];

object[] Han = row.ItemArray;

subitems[0] = Han[6].ToString();

subitems[1] = Han[7].ToString();

subitems[2] = Han[1].ToString();

subitems[3] = Han[2].ToString();

ListViewItem item = new ListViewItem(subitems);

if (FenYe >= 5)//这样前面的记录就不会显示了

{

ListView1.Items.Add(item);

item.ImageIndex = 13;

}

//控制行数达成分页

if (FenYe == 45) break;//后面的不再显示了

}

}

经过调试完成了对显示行数的控制,OK这样看来就能实现分页的目标了,那么,我从这里着手来实现分页设计了,添加1个标签控件用来显示一些与分页有关的文字,添加4个按钮分别用来控制首页尾页上页下页,添加一个用来控制每页显示几条记录的控件,好了,设计好的完整代码一并提供参考如下:

private void 列表(string GuanDong, bool Xz)

{

ListView1.Items.Clear(); ListView1.Columns.Clear();

ListViewItem SLieBiao = new ListViewItem();

SLieBiao.SubItems.Clear();

string[] BMing = new string[] { "xx", "xx", "xx", "xx", "xx", "xx", "xx", "xx", "xx", "xx", "xx",

"xx" };

int[] BKuan = new int[] { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };

for (int Jj = 0; Jj < BMing.Length; Jj++)

{ ListView1.Columns.Add(BMing[Jj], BKuan[Jj], HorizontalAlignment.Center); }

ListView1.GridLines = true;

ListView1.View = View.Details;

ListView1.HeaderStyle = ColumnHeaderStyle.Clickable;

ListView1.FullRowSelect = true;

Hans = myDataSet.Tables[0].Rows.Count; Lies = myDataSet.Tables[0].Columns.Count;//改为公共变量

int FenYe = 0, FenYeKz = 0, TiaoSu = int.Parse(XianShiYeSu.Text), Gd = 0;

if (Xz) TiaoSu = int.Parse(GuanDong);

if (!Xz) Gd = int.Parse(GuanDong);

FenYeKz = Gd * TiaoSu;

DataTable dt = myDataSet.Tables[0];

foreach (DataRow row in dt.Rows)

{

FenYe++; if (FenYe <= FenYeKz) continue;/*因为上面的那个语句代码感觉设计比起来较麻烦,今天又看来一下书,如获至宝一样看到了这语句的用处,平时一般用不到,刚好在这里用得上,那么,采取这个措施后,下面的语句就不会执行,是不是节省计算机资源了?依理分析这样的控制可以应用在任何循环语句中从而达到控制目的,也就可以实现对数据行数的分页了*/

string[] subitems = new string[Lies];

object[] Han = row.ItemArray;

subitems[0] = Han[6].ToString();

subitems[1] = Han[7].ToString();

subitems[2] = Han[1].ToString();

subitems[3] = Han[2].ToString();

ListViewItem item = new ListViewItem(subitems);

ListView1.Items.Add(item);

item.ImageIndex = 13;

if (FenYe == FenYeKz + TiaoSu) break;

}

int Qy = Hans % int.Parse(XianShiYeSu.Text); if (Qy != 0) Qy = 1;//对分页余数的处理

int Dqys = 0; if ((FenYe % TiaoSu) > 0) Dqys = 1;

ZongSu.Text = "总[" + Hans.ToString() + "]条记录;共" + ((Hans / TiaoSu) + Qy).ToString() + "页;

当前["

+ ((FenYe / TiaoSu) + Dqys).ToString() + "/" + ((Hans / TiaoSu) + Qy).ToString() +

"]页。";

}

}

private void XianShiYeSu_SelectedItemChanged(object sender, EventArgs e)//每页显示多少行数据控制

{ 列表(XianShiYeSu.Text, true); 列表("0", false);YeDao = 0; }

private void Sy_Click(object sender, EventArgs e)//首页按钮 YeDao 设为公共变量

{ 列表("0", false); YeDao = 0; MessageBox.Show("已到第一页", "有情提醒"); }

private void Syy_Click(object sender, EventArgs e)//上页按钮

{

if (YeDao > 0) { YeDao--; 列表((YeDao).ToString(), false); }

else MessageBox.Show("已到第一页", "有情提醒");

}

private void Xyy_Click(object sender, EventArgs e)//下页按钮

{

if (YeDao < (Hans / int.Parse(XianShiYeSu.Text)))

{ YeDao++; 列表((YeDao).ToString(), false); }

else MessageBox.Show("已到最后页", "有情提醒");

}

private void Wy_Click(object sender, EventArgs e)//尾页按钮

{

string Wsz = (Hans / int.Parse(XianShiYeSu.Text)).ToString();

YeDao = (Hans / int.Parse(XianShiYeSu.Text)) ;

列表(Wsz, false); MessageBox.Show("已到最后页", "有情提醒");

}

最后发现原来实现分页就这么简单,由于我测试的数据并不大于万,所以,感觉上分页显示不是原来的那么慢了,这种分页方式实际效果如何有待大家去测试,几下就搞定了烦恼的分页问题,一时高兴,忍不住要和大家分享,在这里只做抛砖引玉。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐