我有一个C#WinForm应用程序,我使用ListView来显示哪些文件已上传到我的数据库。我每次都使用相同的代码,在表单加载时调用LoadFileAttachments()
,并在刷新列表时再次调用,或者在数据库中添加或删除其他附件。 (这部分效果很好)
我遇到问题的地方是ListView的GUI端。第一次LoadFileAttachments()
运行并填充ListView时,ListView的左侧与附件之间存在间隙。在随后的电话中,差距消失。
如下所示,列不会改变宽度,似乎只是间隙。我尝试捕获ListView的MouseClick事件,并使用ListViewHitTestInfo查看其中的内容,并显示我单击旁边的项目,其属性为“Selected = false”。单击图标或文本会导致选择项目,但不会在间隙中。
造成差距的原因是什么?
截图:
Screenshot of the gap/no gap http://img831.imageshack.us/img831/4054/fileattachments.png
我每次拨打的代码:
private void LoadFileAttachments()
{
attachmentListView.Items.Clear();
ImageList iconList = new ImageList();
attachmentListView.LargeImageList = iconList;
attachmentListView.SmallImageList = iconList;
attachmentListView.StateImageList = iconList;
FileAttachmentInfo[] fileAttach = dbAccess.RetrieveAttachedRecords(loadPNGid.Value);
foreach (FileAttachmentInfo file in fileAttach)
{
ListViewItem item = new ListViewItem(file.FileName);
item.Tag = file.RowID;
iconList.Images.Add(file.FileExtention, ExtractIcons.GetIconImage(file.FileExtention));
item.ImageKey = file.FileExtention;
item.SubItems.Add(GetFileTypeDescriptors.GetFileDescriptor(file.FileExtention));
item.SubItems.Add(Conversions.FileSizeToString(file.FileSize));
item.SubItems.Add(file.DateAdded.ToShortDateString());
attachmentListView.Items.Add(item);
}
if (attachmentListView.Columns.Count == 0)
{
attachmentListView.Columns.Add("Attachment", 150);
attachmentListView.Columns.Add("File type", -2);
attachmentListView.Columns.Add("Size", -2);
attachmentListView.Columns.Add("Date added", -2);
}
}
这是设计器文件中的代码:
//
// attachmentListView
//
this.attachmentListView.AllowColumnReorder = true;
this.attachmentListView.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.attachmentListView.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.attachmentListView.Location = new System.Drawing.Point(0, 0);
this.attachmentListView.MultiSelect = false;
this.attachmentListView.Name = "attachmentListView";
this.attachmentListView.Size = new System.Drawing.Size(440, 301);
this.attachmentListView.TabIndex = 0;
this.attachmentListView.TileSize = new System.Drawing.Size(188, 130);
this.attachmentListView.UseCompatibleStateImageBehavior = false;
this.attachmentListView.View = System.Windows.Forms.View.Details;
this.attachmentListView.DoubleClick += new System.EventHandler(this.attachmentListView_DoubleClick);
this.attachmentListView.MouseClick += new System.Windows.Forms.MouseEventHandler(this.attachmentListView_MouseClick);
答案 0 :(得分:3)
我认为问题是由您设置StateImageList
属性引起的。根据{{3}}文档,StateImageList
是一个附加图片列表,显示在SmallImageList
旁边。
StateImageList
属性允许您指定一个ImageList,其中包含用于表示ListView控件中项目的特定于应用程序的状态的图像。状态图像显示在项目图标的左侧。您可以使用状态图像(例如选中和未选中复选框)来指示应用程序定义的项状态。状态图像在ListView控件的所有视图中都可见。
尝试将其评论出来,看看是否能解决您的问题。
答案 1 :(得分:1)
如果您在创建IndentCount
时将ListViewItem
明确设置为0,会不会有所不同?
基于调查的新答案
我认为这与ImageList
有关。在设计器中,我可以通过添加和删除图像列表来获得类似的行为。在重建ListView
之前,它无法解决。
我会在开始时向ImageList
添加ListView
,然后只需重复清除并保湿ImageList
。
答案 2 :(得分:0)
如果指定了水平对齐,它会有所不同吗?
attachmentListView.Columns.Add("Name", -2, HorizontalAlignment.Left);