2010-07-19 96 views
1

我有一个C#WinForm应用程序,我正在使用ListView来显示哪些文件已上传到我的数据库。我每次使用相同的代码,当表单加载时调用LoadFileAttachments(),并且每当我刷新列表时,或者从数据库添加或删除附加附件时,都会再次调用LoadFileAttachments()。 (这部分工作很好)为什么在我的ListView中显示出这个差距?

我遇到问题的地方是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

为什么你创建一个ListViewGroup? LV的CheckBoxes属性是否打开过? – 2010-07-19 19:37:29

+0

@Hans不,我从来没有用过这个ListView的CheckBox,并且那个ListViewGroup不应该在那里!我不知道为什么我把它放在那里(可能试图在某些时候做一些不同的事情),但我从来不会这样做。谢谢你的追捕 - 在这里和我的来源,同样的问题。 – 2010-07-19 19:45:33

+0

将视图设置为LargeIcon并返回到细节将非常稳固地将它击倒在头上。 – 2010-07-19 19:47:55

回答

3

我相信问题是由于您设置StateImageList属性造成的。根据ListView.StateImageList文档StateImageList是沿着SmallImageList旁边显示的附加图像列表。

StateImageList属性允许你指定包含图像用来表示ListView控件中的项目的应用程序特定状态的ImageList。状态图像显示在项目图标的左侧。您可以使用状态图像(如已选中或未选中的复选框)来指示应用程序定义的项目状态。状态图像在ListView控件的所有视图中都可见。

试着评论一下,看看是否能解决你的问题。

+0

这样做!我不知道为什么问题在运行后会消失代码两次(因为StateImageList被构建了两次),但这可以防止它首先发生,谢谢! – 2010-07-19 20:39:00

0

难道做如果您指定了水平对齐,那么区别?

attachmentListView.Columns.Add("Name", -2, HorizontalAlignment.Left); 
+0

只是试了一下,没有改变。不过,我在我的问题上犯了一个错误 - 当我点击空白处的命中测试时,会显示我旁边点击的项目。现在编辑这个问题... – 2010-07-19 19:18:39

1

它使不同的,如果你明确设置IndentCountListViewItem为0,当你创建它们?

根据调查

我觉得这与ImageList做新的答案。在设计师中,我可以通过添加和删除图像列表来获得类似的行为。直到重建ListView才能解决问题。

我会在开头添加一个ImageListListView,然后简单地清除并重复同样的ImageList水合物。

+0

有趣的想法。当我将它设置为0时没有任何效果,但是当我将它设置为1时,会有区别。当我将每个项目的“IndentCount”设置为1时,列表首次加载时,项目将会是if我将缩进设置为2.刷新后,它移动到Indent = 1的位置,这就是列表在第一次加载时的样子。就像列表中的项目有一个消失的缩进! – 2010-07-19 19:29:23

+0

我们可以看到ListView的初始设置吗?在哪里attachmentListView被实例化...(不认为它会有所作为,但以防万一。 – 2010-07-19 19:37:47

+0

将它添加到我的帖子的底部 – 2010-07-19 19:47:05

相关问题