2011-08-05 3 views
3

ListBoxで1つのアイテムのみを無効にすることはできますか?アイテムの矩形を取得する方法はないようです(コントロール内のすべてのピクセル/少なくとも1つの列の各ピクセルについてIndexFromPointを呼び出す以外に、特定のアイテムが表示されている場合でも)。ListBox内の1つのアイテムのみを無効にします

これはC#WinForms(WPFではなく)用です。私がやろうとしていますかについて

詳細情報:

私はそれで多くの項目でListBoxを持っている、と私は、「ボタン」のセットは赤など、あなたが上にマウスを移動アイテム(上に表示したいです削除のためのX)。 10個以上のアイテムを持つリストを除いて、これは素晴らしいことですが、新しいアイテムの上にカーソルを置くたびに、コントロール全体が無効になるので、表示された再描画が行われます。データは変更されず、ディスプレイだけが変更されます。

編集:私はすでにListBoxをサブクラス化し、ListBoxOnDrawItemので、保護された方法で私の描画を行う詳細情報および以前の試み

を使用することができます。

さまざまなレベルで以下のことを試しました。変数thisは、延長されたListBoxであり、indexは、引き出されるアイテムであり、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つのアイテムを動かす前にそれが原因でした)。

+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

また、DrawItemで図面を作成するので、ListBoxから既に継承しています。私はいくつかの情報で私の質問を更新します。 – coderforlife

関連する問題