ListView控件问题(在线等)

aierduo 2007-01-18 01:07:14
Winform 窗体上有一个ListView 2个Buttons 1个label
//****************
private void button2_Click(object sender, System.EventArgs e)
{
try
{
this.listView1 .Clear ();
this.listView1.Columns .Add ("名",50,HorizontalAlignment.Left);
this.listView1.Columns .Add ("姓",50,HorizontalAlignment.Left);
this.listView1.Columns .Add ("级",50,HorizontalAlignment.Left);
this.listView1.Columns .Add ("tt",50,HorizontalAlignment.Left);
for(int i=0;i<5;i++)
{
string []sub={"ww"+i,"ee"+i,"rr"+i,"ss"+i};
this.listView1 .Items .Insert (this.listView1.Items .Count ,new ListViewItem (sub));
}
}
catch(Exception Error)
{
this.label1 .Text =Error.Message ;
}
}
//***************
private void button1_Click(object sender, System.EventArgs e)
{
try
{
this.listView1 .Clear ();
this.listView1.Columns .Add ("名称",50,HorizontalAlignment.Left);
this.listView1.Columns .Add ("姓名",50,HorizontalAlignment.Left);
this.listView1.Columns .Add ("级别",50,HorizontalAlignment.Left);
for(int i=0;i<5;i++)
{
string []sub={"Ni"+i,"Wo"+i,"Ta"+i};
this.listView1 .Items .Insert (this.listView1.Items .Count ,new ListViewItem (sub));
}
}
catch(Exception Error)
{
this.label1 .Text =Error.Message ;
}
}
//****************
private int CurrentColumn = -1; //记录上次点击的列号
private bool b_Convert = false; //记录正逆序信息
//****************
private void listView1_ColumnClick_1(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
if(e.Column == CurrentColumn)
{
b_Convert = ! b_Convert;

}
else
{
CurrentColumn = e.Column;
b_Convert = false;

}
this.listView1 .ListViewItemSorter = new ListSortBySubItem(this.CurrentColumn ,b_Convert);
}
//******************排序
public class ListSortBySubItem : IComparer
{
private int m_Column = 0;
private int m_SortType = 0;//排序类型
private bool m_asc = true;
public ListSortBySubItem(int Column,bool bAsc)
{
m_Column = Column;
m_asc = bAsc;
}
public ListSortBySubItem(int Column,bool bAsc, int SortType)
{
m_Column = Column;
m_SortType = SortType;
m_asc = bAsc;
}
int IComparer.Compare(object x, object y)
{
string item1 = ((ListViewItem)x).SubItems[m_Column].Text.Trim();
string item2 = ((ListViewItem)y).SubItems[m_Column].Text.Trim();
int intSort = 0;
if(!m_asc)//反序
{
string temp = item1;
item1 = item2;
item2 = temp;
}

if(m_SortType == 0) //字符排序
intSort = String.Compare(item1,item2);
else //数值排序
{
double str1 = 0;
double str2 = 0;
if(item1 == "")//为空设置为最小
return 1;
else if(item2 == "")
return 0;
try
{
str1 = double.Parse(item1);
str2 = double.Parse(item2);
}
catch
{
//转换出错
return 0;
}
if(str1 >=str2)
return 0;
else
return 1;

}
return intSort;
}


}

//****************
问题 当我点击button2之后 Listview显示4列数据 我点击第四列进行排序(显示正常)然后我点击button1(我想显示另外3行数据),此时显示出错 *指定的参数已超出有效值的范围。\r\n参数名: “3”不是“index”的有效值。*


//****************
大家救命啊!!!
...全文
384 点赞 收藏 21
写回复
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
l5823448 2007-01-19
jf
http://www.morok.biz/?u=xueshou
回复
aierduo 2007-01-18
好的谢谢了
回复
liujia_0421 2007-01-18
TO:是不是Listview 构造的时候是不是按照默认的ListViewItemSorter 排序呢?

是的..

因为你之前点击第四列时,由于这条语句 this.listView1.ListViewItemSorter = new ListSortBySubItem(this.CurrentColumn, b_Convert);
已经指定了排序的方式..

添加项时会自动进行排序的..

回复
liujia_0421 2007-01-18
原因是这样的..

你先点击Button2,添加后,又点击第四列进行排序..此时=3;

而当你点击Button1时,添加一项时没有问题,当添加第二项时,它会自动排序,调用你的排序类中的方法,而你的排序类中用到了CurrentColumn为3,而你此时的ListView只有三列,最大索引是2,所以就出现异常了...

解决的方法是,在添加项的时候将排序屏蔽掉即可..
回复
aierduo 2007-01-18
谢谢
是不是Listview 构造的时候是不是按照默认的ListViewItemSorter 排序呢?
回复
aierduo 2007-01-18
要是我的排序类有问题 也因该是排序是出的错啊
怎么会是在我 创建listview 的item是出错呢
而且都是在添加第二个item时出错的

回复
liujia_0421 2007-01-18
找到问题所在了..

这样改下即可:

你Button1下的代码这样改下:

this.listView1.Clear();
this.listView1.Columns.Add("名称", 50, HorizontalAlignment.Left);
this.listView1.Columns.Add("姓名", 50, HorizontalAlignment.Left);
this.listView1.Columns.Add("级别", 50, HorizontalAlignment.Left);
this.listView1.ListViewItemSorter = null;
for (int i = 0; i < 5; i++)
{
string[] sub ={ "Ni" + i, "Wo" + i, "Ta" + i };
this.listView1.Items.Insert(this.listView1.Items.Count, new ListViewItem(sub));
}

即加上这么一句就OK了..

this.listView1.ListViewItemSorter = null;
回复
liujia_0421 2007-01-18
确实是有问题..

应该是你排序类的问题..
回复
aierduo 2007-01-18
不是吧你先点击 buttons2
再点击 tt列排序
然后点击buttons1
就会出错
回复
liujia_0421 2007-01-18
晕,我把你的代码拷了一下,测试没一点问题..
回复
aierduo 2007-01-18
显示的出错
指定的参数已超出有效值的范围。\r\n参数名: “3”不是“index”的有效值。
回复
zhuming731 2007-01-18
我也来帮你顶一下~
回复
liujia_0421 2007-01-18
不好意思,我刚才的说法有误...
回复
aierduo 2007-01-18
说是这错

this.listView1 .Items .Insert (this.listView1.Items .Count ,new ListViewItem (sub));

但是这明显每错吗

你说的确实是有道理
但是我跟进去 看了一下 listView1 的属性 显示是正常的(就是点击Button1时,它的Columns 和Items都是 0)
回复
sophia1984 2007-01-18
我也来帮你顶一下~
回复
liujia_0421 2007-01-18
没具体看你的代码,断点跟一下,看是在哪出现的异常,并把异常的具体信息也贴一下...
回复
aierduo 2007-01-18
自己顶一下
回复
aierduo 2007-01-18
哥们 人那去了。。。
回复
aierduo 2007-01-18
但是 我之前 是这么写的 this.listView1 .Items .Clear ();
this.listView1 .Columns .Clear ();
照样有错阿
回复
liujia_0421 2007-01-18
而结果你在Button1点击时:

this.listView1.Columns .Add ("名称",50,HorizontalAlignment.Left);
this.listView1.Columns .Add ("姓名",50,HorizontalAlignment.Left);
this.listView1.Columns .Add ("级别",50,HorizontalAlignment.Left);

又创建了三列....

我想楼主可能认为用this.listView1 .Clear ();就能清除掉所有的列吧..但是楼主理解错了..
这样是不行的..
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.