views:

615

answers:

4

Is there a Tag for an Item in the CheckedListBox? Or something similar? I would like to be able to store and ID associated with the item that I'm displaying.

+1  A: 

You can inherit your own control from CheckedListBox and create a property, in C# it would be like this, the rest of the functionality remains the same as it is inherited so no further additional code required:

public class MyCheckedListbox : System.Windows.Forms.CheckedListBox{
    private object thisObj;
    public object Tag{
       get{ return this.thisObj; }
       set{ this.thisObj = value; }
    }
}

Edit: Decided to include the VB.NET version for everyone's benefit also...

Public Class MyCheckedListBox Inherits System.Windows.Forms.CheckedListBox
    Private thisObj As Object
    Public Property Tag As Object
      Get
        Tag = thisObj
      End Get
      Set (objParam As Object)
        thisObj = objParam
      End Set
    End Property
End Class

Of course, this is plain and uses boxing but works nicely...

Hope this helps, Best regards, Tom.

tommieb75
can this be done in vb.net as well?
bochur1
@bochur1: yes it can...let me see if I can translate it to VB.NET for you....
tommieb75
@Bochur1: Ok, I have edited my answer...hope there's no errors there... :)
tommieb75
A: 

Translation of tommieb75 answer to VB.NET:

Public Class MyCheckedListbox 
    Inherits System.Windows.Forms.CheckedListBox 
    Private thisObj As Object 
    Public Property Tag() As Object 
        Get 
            Return Me.thisObj 
        End Get 
        Set(ByVal value As Object) 
            Me.thisObj = value 
        End Set 
    End Property 
End Class

I use the translator at www.developerfusion.com/tools

kevinw
A: 

The answers posted don't work. The Tag item created is associated with the control, not the checkedlistbox items themselves as with other controls.

Pete
+1  A: 

You don't need a Tag property. The control accepts any object, that means you don't have to put just strings in it. Make a class that has a string (and overrridden ToString()) and any other data members you need.

Public Class Form1

    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)

        CheckedListBox1.Items.Add(New MyListBoxItem() With {.Name = "One", .ExtraData = "extra 1"})
        CheckedListBox1.Items.Add(New MyListBoxItem() With {.Name = "Two", .ExtraData = "extra 2"})
    End Sub

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
        For Each obj As Object In CheckedListBox1.CheckedItems
            Dim item As MyListBoxItem = CType(obj, MyListBoxItem)
            MessageBox.Show(String.Format("{0}/{1} is checked.", item.Name, item.ExtraData))
        Next
    End Sub
End Class

Public Class MyListBoxItem
    Private _name As String
    Private _extraData As String

    Public Property Name As String
        Get
            Return _name
        End Get
        Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Public Property ExtraData As String
        Get
            Return _extraData
        End Get
        Set(ByVal value As String)
            _extraData = value
        End Set
    End Property

    Public Overrides Function ToString() As String
        Return Name
    End Function

End Class

(The overridden ToString() dictates what will be displayed in the box.)

OwenP