public void SelectItem(int nIndex)
        {
            ButtonBox.Item itPrevItem = null;
            ButtonBox.Item itCurrItem = null;
            m_dictMutex.WaitOne();
            if (m_dictItems.ContainsKey(m_nCurrentSelected))
            {
                itPrevItem = m_dictItems[m_nCurrentSelected].Clone();
            }

            if (m_dictItems.ContainsKey(nIndex))
            {
                itCurrItem         = m_dictItems[nIndex].Clone();
                m_nCurrentSelected = nIndex;
            }
            else
            {
                m_nCurrentSelected = -1;
            }

            m_dictMutex.ReleaseMutex();
            Invalidate();
            if (ItemSelected == null)
            {
                return;
            }

            ItemSelected(itPrevItem, itCurrItem, this);
        }
        public void AddItem(ButtonBox.Item itButtonBoxItem)
        {
            if (itButtonBoxItem == null)
            {
                return;
            }

            m_dictMutex.WaitOne();
            m_dictItems.Add(m_dictItems.Count, itButtonBoxItem.Clone());
            m_dictMutex.ReleaseMutex();
            Invalidate();
        }
        public ButtonBox.Item GetItem(int nIndex)
        {
            ButtonBox.Item obj = null;
            m_dictMutex.WaitOne();
            if (m_dictItems.ContainsKey(nIndex))
            {
                obj = m_dictItems[nIndex].Clone();
            }

            m_dictMutex.ReleaseMutex();
            return(obj);
        }
        private void ButtonBox_MouseUp(object sender, MouseEventArgs e)
        {
            if (m_dictItems.Count <= 0)
            {
                return;
            }

            ButtonBox.Item itPrevItem = null;
            m_dictMutex.WaitOne();
            float num = Height / (float)m_dictItems.Count;

            if (m_dictItems.ContainsKey(m_nCurrentSelected))
            {
                itPrevItem = m_dictItems[m_nCurrentSelected].Clone();
            }

            m_dictMutex.ReleaseMutex();
            int key = (int)Math.Truncate(e.Y / (double)num);

            if (key < 0 || key >= m_dictItems.Count)
            {
                return;
            }

            m_dictMutex.WaitOne();
            if (m_dictItems.ContainsKey(key))
            {
                ButtonBox.Item itCurrItem = m_dictItems[key].Clone();
                m_nCurrentSelected = key;
                Invalidate();
                m_dictMutex.ReleaseMutex();
                if (ItemSelected == null)
                {
                    return;
                }

                ItemSelected(itPrevItem, itCurrItem, this);
            }
            else
            {
                m_dictMutex.ReleaseMutex();
            }
        }
        public void ClearItem()
        {
            ButtonBox.Item itPrevItem = null;
            m_dictMutex.WaitOne();
            if (m_dictItems.ContainsKey(m_nCurrentSelected))
            {
                itPrevItem = m_dictItems[m_nCurrentSelected].Clone();
            }

            m_dictItems.Clear();
            m_dictMutex.ReleaseMutex();
            m_nCurrentSelected = -1;
            Invalidate();
            if (ItemSelected == null)
            {
                return;
            }

            ItemSelected(itPrevItem, null, this);
        }