listview checkboxes 用Imagelist设置宽高后不显示
在用 C# 开发 Winform 时,遇到一个问题,用 listview 显示表格时,同时显示 checkboxes,使用 imageslist 控件设置 listview 的高度后,在 Win7(Windows Server 2008 R2) 以上版本系统,checkboxes显示,而 XP(Windows Server 2003)却不显示;如果不用 ImageList 设置高度,XP 也显示 checkboxes。开始以为 XP 不支持用 ImageList 设置 listview 高宽,后来做了一个简单的测试实例,却可以显示,说明是代码问题而不是系统问题。
一、XP(Windows 2003)不显示 checkboxes 代码
private void ListviewTable()
{
lv.Clear();
lv.GridLines = true;
lv.View = View.Details;
lv.Scrollable = true;
lv.FullRowSelect = true;
lv.CheckBoxes = true;
//设置行高
ImageList imgList = new ImageList();
imgList.ImageSize = new Size(1, 22);
lv.SmallImageList = imgList;
lv.Columns.Add("用户名", 120, HorizontalAlignment.Center);
lv.Columns.Add("密码", 80, HorizontalAlignment.Center);
ListViewItem ListViewItem1 = new ListViewItem();
ListViewItem1.SubItems.Clear();
ListViewItem1.SubItems[0].Text = "春天满绿";
ListViewItem1.SubItems.Add("90874869");
lv.Items.Add(ListViewItem1);
ListViewItem1 = new ListViewItem();
ListViewItem1.SubItems[0].Text = "薄云飘里";
ListViewItem1.SubItems.Add("890532086");
lv.Items.Add(ListViewItem1);
}
上述代码关键的一点是,用 ImageList 设置行高的代码是在向 listview 添加的数据的上面,如果把它们放到向 listview 添加的数据的后面,则 XP 也可以显示 checkboxes 复选框。
二、XP(Windows 2003)显示 checkboxes 代码
private void ListviewTable()
{
lv.Clear();
lv.GridLines = true;
lv.View = View.Details;
lv.Scrollable = true;
lv.FullRowSelect = true;
lv.CheckBoxes = true;
lv.Columns.Add("用户名", 120, HorizontalAlignment.Center);
lv.Columns.Add("密码", 80, HorizontalAlignment.Center);
ListViewItem ListViewItem1 = new ListViewItem();
ListViewItem1.SubItems.Clear();
ListViewItem1.SubItems[0].Text = "春天满绿";
ListViewItem1.SubItems.Add("90874869");
lv.Items.Add(ListViewItem1);
ListViewItem1 = new ListViewItem();
ListViewItem1.SubItems[0].Text = "薄云飘里";
ListViewItem1.SubItems.Add("890532086");
lv.Items.Add(ListViewItem1);
//设置行高
ImageList imgList = new ImageList();
imgList.ImageSize = new Size(1, 22);
lv.SmallImageList = imgList;
}
对于 Win7 以上版本系统,无论把设置行高代码放在向 listview 添加数据之前还是之后,都可以正常显示 checkboxes;对 XP及以下版本的系统,应该是系统设计时要求把用 ImageList 设置 listview 行高的代码放在添加数据之后。
一点提示:
如果 listview 是共用的,在绑定数据前,要把 lv.SmallImageList = null;,这样在添加数据后重新设置 listview 的高度才有效,因为前一程序可能已经设置了 listview 的高度,在最后再设置一次也无效。