为什么这个差距出现在我的ListView中?

时间:2010-07-19 19:01:35

标签: c# winforms user-interface listview

我有一个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);

3 个答案:

答案 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);