删除项目后的C#ListView项目选择问题

时间:2010-02-17 22:49:30

标签: c# listview selection listviewitem

使用Visual Studio 2008,.Net 3.5

我有一个ListView加载了一堆项目。我有一个右键单击弹出窗口来删除项目。删除项目后,我通过重新访问我的主数据来重绘列表视图,并重置所选项目。但是,所选项目不会显示为选中

代码的想法:

public ListView m_lv;  
public MyDataCollection m_Data;  // Has a function to get data based on a tag.  

public void RemoveEventHandler(object sender, EventArgs e)  
{  
  int iSelectedItem= m_lv.FocusedItem.Index;

  int iDataIndexToRemove= m_Data.GetIndexOf(m_lv.FocusedItem.Tag.ToString());  

  m_Data.RemoveAt(iDataIndexToRemove);  // Remove the item.  

  if(0 != m_lv.Items.Count)  
  {  
    if(iSelectedItem == m_Data.Items.Count)  // Removed last.  
      iSelectedItem= m_Data.Items.Count - 1;  
  }

  m_lv.Items.Clear();  // Clear the list view items.  

  // Completely rebuild the list view.  
  foreach(MyData md in m_Data)  
  {  
    ListViewItem lvi= new ListViewItem(md.Column0.ToString());  
    lvi.SubItems.Add(md.Column1.ToString());  
    lvi.SubItems.Add(md.Column3.ToString());  
    lvi.SubItems.Add(md.Column4.ToString());  

    m_lv.Items.Add(lvi);  
  }  

  // Set up tags, column sizes, etc.  

  if(0 != m_lv.Items.Count)  
    m_lv.Items[iSelectedItem].Selected= true;  // Set the selection.      
}  

如果我执行上述操作,则所选项目永远不会将视觉显示为选中(无背景颜色更改),除非我重新调整列大小或排序。然后它显示为已选中。但是,如果我使用调试器或添加按钮来使用消息框向我显示所选项目,则项目知道它已被选中。

我知道这是某种刷新/绘图问题 - 任何想法?

4 个答案:

答案 0 :(得分:2)

听起来您的右键单击弹出窗口中的ListView没有焦点,并且HideSelection设置为true。这意味着当您的商品 被选中时,WinForms不会显示它。首先关闭HideSelection进行检查,然后您需要一些代码将焦点设置回列表视图。

另外:

  1. 如果您使用ListView.Items.Clear(),则不会丢失列,因此每次都必须重新添加它们(这会激怒已调整列标题大小的用户)。
  2. 不要做整个清除和刷新的事情。将每个ListViewItem的{​​{1}}属性设置为您的主键,然后您可以执行Name

答案 1 :(得分:0)

设置选择后,尝试在ListView上调用Invalidate方法。

答案 2 :(得分:0)

使用此:

m_lv.BeginUpdate();

// Add the items

m_lv.EndUpdate();
//
if(0 != m_lv.Items.Count)  
    m_lv.Items[iSelectedItem].Selected= true;  // Set the selection.   

不要调用'Invalidate',使用Begin / End Update应该防止闪烁并刷新......

编辑:解释我在声明背后的理由...... BeginUpdate冻结任何WM_PAINT消息...... EndUpdate解冻WM_PAINT,这使得列表中的添加项目显得更快,无论如何,在调用EndUpdate之后,它将刷新!选择可以是两种方式,我更喜欢把它放在EndUpdate之外...这是我的看法...... Invalidate生成WM_PAINT消息但不一定要立即处理...不建议调用Invalidate()in随着刷新速度减慢而添加项目的循环!

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:0)

结果很容易:

// Figure out index of item to remove, iRemoved, do some work....  

m_lv.Items.RemoveAt(iRemoved);  
m_lv.Refresh();

// Figure out what is left so new selection, iNewSelection, can be set....
m_lv.Items[iNewSelection].Selected = true;  

忘了我没有更新这篇文章!