2011-08-05 50 views
3

反正只有使ListBox中的單個項目無效嗎?似乎沒有獲得項目矩形的方法,或者即使特定項目可見(除了爲控件中的每個像素調用IndexFromPoint /至少一列中的每個像素)。只使ListBox中的一個項目無效

這是C#的WinForms(未WPF)。

什麼,我試圖做

更多信息:

我與它的許多項ListBox,我想了一組「按鈕」出現在你將鼠標懸停在(如紅色物品X刪除)。除了在包含10個或更多項目的列表上,每當您將鼠標懸停在新項目上時,它都會導致可見的重繪,因爲我無效整個控件。數據不會改變,只會改變顯示。

編輯:更多信息和以前的嘗試

我已經繼承ListBoxOnDrawItem如此保護的ListBox方法執行我的畫都可以使用。

我試過以下不同級別的成功。可變this是擴展ListBoxindex是繪製在,old_index是先前被繪製在所述項目的項目。

// Causes flicker of entire list, but works 
this.Invalidate(); 

// Causes flicker of selected item, but works 
int sel_index = this.SelectedIndex; 
this.SelectedIndex = old_index; 
this.SelectedIndex = index; 
this.SelectedIndex = sel_index; 

// Does not work 
if (old_index >= 0) 
    this.RefreshItem(old_index); 
if (index >= 0) 
    this.RefreshItem(index); 

回答

5

好吧,我是傻。感謝@LarsTech,我決定再次查看整個ListBox函數列表,並找到合適的函數:GetItemRectangle,它甚至是公開的!我不知道我怎麼錯過了一個鐘頭......

工作的解決方案是:

if (old_index >= 0) 
    this.Invalidate(this.GetItemRectangle(old_index)); 
if (index >= 0) 
    this.Invalidate(this.GetItemRectangle(index)); 

仍產生一點點閃爍,但顯著以下(唯一可見的,當我鼠標移到許多非常在移動單個項目之前快速移動它)。

+1

嘿謝謝你的答案,這幫助我閃爍的列表框。我也用:this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);以幫助減少閃爍。 – ChandlerPelhams

1

是的,但你必須在繼承它,並露出RefreshItem方法,微軟是從你隱藏了創建自己的列表框的版本:

public class ListBoxEx : ListBox 
{ 
    public new void RefreshItem(int index) 
    { 
    base.RefreshItem(index); 
    } 
} 
+0

這不起作用。我相信它是因爲底層數據沒有變化和/或列表不使用DisplayMember。 – coderforlife

+0

另外,我已經從ListBox繼承,因爲我在DrawItem中執行繪圖。我會用更多的信息更新我的問題。 – coderforlife

相關問題