2009-08-10 15 views

答えて

0

オーナー描画のListBoxを実装する必要があります。私はすべての項目のアイコンとチェックボックスを表示するものがありますが、簡単に変更して特定の項目のチェックボックスのみを表示することもできます。

public class IconizedCheckedListBox : ListBox 
{ 
    public IconizedCheckedListBox() 
     : base() 
    { 
     DrawMode = DrawMode.OwnerDrawVariable; 
     DoubleBuffered = true; 
    } 

    protected override void OnDrawItem(DrawItemEventArgs e) 
    { 
     Graphics g = e.Graphics; 
     g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; 


     using (SolidBrush b = new SolidBrush(BackColor)) 
      g.FillRectangle(b, e.Bounds); 

     //e.DrawBackground(); 
     //e.DrawFocusRectangle(); 

     if (e.Index < Items.Count && e.Index != -1) 
     { 
      IconizedCheckedListBoxItem item = (IconizedCheckedListBoxItem)Items[e.Index]; 

      Rectangle checkBounds = e.Bounds; 
      checkBounds.X += kCheckboxPadding; 
      checkBounds.Y += (checkBounds.Height - kCheckboxSize)/2; 
      checkBounds.Width = kCheckboxSize; 
      checkBounds.Height = kCheckboxSize; 
      CheckBoxRenderer.DrawCheckBox(g, checkBounds.Location, 
       item.Checked?CheckBoxState.CheckedNormal:CheckBoxState.UncheckedNormal); 

      using (SolidBrush b = new SolidBrush(ForeColor)) 
      { 
       StringFormat format = new StringFormat(); 
       format.LineAlignment = StringAlignment.Center; 
       format.Alignment = StringAlignment.Near; 
       Rectangle textBounds = e.Bounds; 
       textBounds.X += item.Icon.Width + 2*kCheckboxPadding + kCheckboxSize; 
       textBounds.Y += 1; 
       textBounds.Width -= item.Icon.Width; 
       textBounds.Height -= 1; 
       Font f; 
       if (item.Checked) 
        f = new Font(Font, FontStyle.Bold); 
       else 
        f = Font; 
       g.DrawString(item.Data.ToString(), f, b, textBounds, format); 
      } 

      Image icon; 
      if (!item.Checked) 
       icon = Utilities.Utilities.WashOutImage(item.Icon); 
      else 
       icon = item.Icon; 
      g.DrawImage(icon, e.Bounds.X + 2 * kCheckboxPadding + kCheckboxSize, e.Bounds.Y); 
     } 
    } 

    protected override void OnMeasureItem(MeasureItemEventArgs e) 
    { 
     e.ItemHeight = kItemHeight; 
    } 

    protected override void OnMouseClick(MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Left) 
     { 
      int idx = IndexFromPoint(e.Location); 
      if (idx != -1) 
      { 
       IconizedCheckedListBoxItem item = (IconizedCheckedListBoxItem)Items[idx]; 
       item.Checked = !item.Checked; 

       if (ItemCheck != null) 
       { 
        ItemCheckEventArgs args = new ItemCheckEventArgs(
         idx, 
         item.Checked ? CheckState.Checked : CheckState.Unchecked, 
         CheckState.Indeterminate); 
        ItemCheck(this, args); 
       } 
       Invalidate(); 
      } 
     } 
     base.OnMouseClick(e); 
    } 

    /// <summary> 
    /// This is called AFTER the check state has been updated 
    /// </summary> 
    public event ItemCheckEventHandler ItemCheck; 

    private const int kItemHeight = 32; 
    private const int kCheckboxSize = 13; 
    private const int kCheckboxPadding = 4; 
} 

public class IconizedCheckedListBoxItem 
{ 
    public IconizedCheckedListBoxItem(Image inIcon, object inData) 
    { 
     Icon = inIcon; 
     Data = inData; 
     Checked = false; 
    } 

    public override string ToString() 
    { 
     return Data.ToString(); 
    } 

    public Image Icon; 
    public object Data; 
    public bool Checked; 
} 
+1

OPは "ListBox"ではなく "ListView"を要求しました。これは有効な答えではありません。 – Nick

1

これらの行はヘッダーですか?その場合は、ListViewでGroupsを使用することを検討してください。

EDIT:

私はリストビュー項目のサブセットにチェックボックスを表示する方法を認識していませんよ。別の方法として、灰色にするアイテムのForeColorを設定し、ItemCheckイベントでこれらのアイテムのチェックステートをチェックするとチェックを外すようにリセットすることができます。

+1

選択できない行だけのヘッダーはありません。顧客がチェックボックスを非表示にしたい – zidane

関連する問題