2010-09-08 25 views

cevap

28

Sen Drawitem olay geçersiz kılmak ve DrawMode mülkiyet

DrawMode.OwnerDrawFixed için onay Yukarıdaki kod bana yardımcı olarak bu ileride kimse yardımcı olacak bu örnek Umarım

private void listBox1_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    if (e.Index<0) return; 
    //if the item state is selected them change the back color 
    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
     e = new DrawItemEventArgs(e.Graphics, 
            e.Font, 
            e.Bounds, 
            e.Index, 
            e.State^DrawItemState.Selected, 
            e.ForeColor, 
            Color.Yellow);//Choose the color 

    // Draw the background of the ListBox control for each item. 
    e.DrawBackground(); 
    // Draw the current item text 
    e.Graphics.DrawString(listBox1.Items[e.Index].ToString(),e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault); 
    // If the ListBox has focus, draw a focus rectangle around the selected item. 
    e.DrawFocusRectangle(); 
} 

alt text

+0

Bu kodu uyguladım ancak liste kutusundaki öğeler arka plan ve ön plan üzerinde beyaz renktedir. Bunu neden yaptığını göremiyorum? – Qosmo

+1

'DrawMode 'özelliğini" DrawMode.OwnerDrawFixed "olarak ayarlıyor musunuz? – RRUZ

+1

Evet, aksi takdirde Normalde varsayılan pencere rengi olur. – Qosmo

1

Aşağıdaki kod söylediğini tam olarak ne yapar:

ınitializecomponent yönteminde

:

this.listBox1.DrawMode = DrawMode.OwnerDrawFixed; 
this.listBox1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(listBox1_DrawItem); 
this.listBox1.SelectedIndexChanged += new System.EventHandler(listBox1_SelectedIndexChanged); 

Ve olay işleyicileri:

:

void listBox1_SelectedIndexChanged(object sender, System.EventArgs e) 
{ 
    this.listBox1.Invalidate(); 
} 

void listBox1_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e) 
{ 
    int index = e.Index; 
    Graphics g = e.Graphics; 
    foreach (int selectedIndex in this.listBox1.SelectedIndices) 
    { 
     if (index == selectedIndex) 
     { 
      // Draw the new background colour 
      e.DrawBackground(); 
      g.FillRectangle(new SolidBrush(Color.Red), e.Bounds); 
     } 
    } 

    // Get the item details 
    Font font = listBox1.Font; 
    Color colour = listBox1.ForeColor; 
    string text = listBox1.Items[index].ToString(); 

    // Print the text 
    g.DrawString(text, font, new SolidBrush(Color.Black), (float)e.Bounds.X, (float)e.Bounds.Y); 
    e.DrawFocusRectangle(); 
} 

Kod alınır

http://www.weask.us/entry/change-listbox-rsquo-selected-item-backcolor-net

+0

Bu konuda bir sorun yaşıyorum. Seçim kırmızıya dönüşür, ancak daha önce seçmiş olduğum tüm öğelerde "görsel" seçilmiş bir öğeye sahip olmanın amacını ortadan kaldırır. Ne olabilirdi? – Qosmo

6

ayarlamalısınız ama değil% 100

Hala şu sorunlarla karşılaştım:
- başka bir dizin seçtiğimde, yeni seçilen dizin de kırmızı renkte vurgulanacaktı.
- liste kutusunun yazı tipi boyutunu değiştirdiğimde, vurgulanan alan küçük olur. düzeltmeleri Aşağıda

o sorun

  • değişiklik
  • liste kutusu için bir MeasurItem ve DrawItem etkinlik oluşturmak ownerdrawvariable için DrawMode
private void lstCartOutput_MeasureItem(object sender, MeasureItemEventArgs e) 
{ 
    // Cast the sender object back to ListBox type. 
    ListBox listBox = (ListBox)sender; 
    e.ItemHeight = listBox.Font.Height; 
} 

private void lstCartOutput_DrawItem(object sender, DrawItemEventArgs e) 
{ 
    ListBox listBox = (ListBox)sender; 
    e.DrawBackground(); 
    Brush myBrush = Brushes.Black; 

    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
    { 
     myBrush = Brushes.Red; 
     e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0, 64, 64)), e.Bounds); 
    } 

    else 
    { 
     e.Graphics.FillRectangle(Brushes.White, e.Bounds); 

    } 

    e.Graphics.DrawString(listBox.Items[e.Index].ToString(),e.Font, myBrush, e.Bounds); 
    e.DrawFocusRectangle(); 
} 


Ben de MSDN web sitesi başvurulan .

+0

Doğru cevap bu olmalı –

0

Aynı sorunu yaşıyorum.

Ne yazık ki veri kaynağım Varlık Sınıfı Listesi’dir. Bu yüzden yukarıdaki kod ile kabul edilen yanıtla aynı koda sahibim ama ListBox'ım için DrawString üzerinde gereksinim duyduğum Sınıfı tam olarak seçmek için küçük bir modifikasyon var:

if (e.Index < 0) return; 
     if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) 
      e = new DrawItemEventArgs(e.Graphics, 
             e.Font, 
             e.Bounds, 
             e.Index, 
             e.State^DrawItemState.Selected, 
             e.ForeColor, 
             Color.Yellow); 

    e.DrawBackground(); 
    //This is my modification below: 
    e.Graphics.DrawString(ctListViewProcess.Items.Cast<entMyEntity>().Select(c => c.strPropertyName).ElementAt(e.Index), e.Font, Brushes.Black, e.Bounds, StringFormat.GenericDefault); 
    e.DrawFocusRectangle();