Как избавиться от эффекта выделения выделенного флажка? - PullRequest
14 голосов
/ 02 декабря 2008

При нажатии на элемент в флажке со списком, он подсвечивается. Как я могу предотвратить этот эффект выделения?

Я могу подключиться к событию SelectedIndexChanged и очистить выделение, но выделение все равно происходит, и вы видите сообщение. Фактически, если вы удерживаете нажатой кнопку мыши, но не отпускаете ее после того, как щелкнули область флажка, выделение остается выделенным, пока вы не отпустите кнопку мыши. Я вообще хочу полностью избавиться от этого эффекта выделения.

Ответы [ 5 ]

25 голосов
/ 08 июня 2012

Используйте следующее:

private void checkedListBox1__SelectedIndexChanged(object sender, EventArgs e)
        {
            checkedListBox1.ClearSelected();
        }
12 голосов
/ 02 декабря 2008

это будет сделано, если вы не получите бит пунктирной линии.

this.checkedListBox1.SelectionMode = System.Windows.Forms.SelectionMode.None;

хотя теперь вы не можете установить флажки ... поэтому вам придется сделать что-то вроде этого:

  private void checkedListBox1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < checkedListBox1.Items.Count; i++)
        {


          if (checkedListBox1.GetItemRectangle(i).Contains(checkedListBox1.PointToClient(MousePosition)))
          {
              switch (checkedListBox1.GetItemCheckState(i))
              {
                  case CheckState.Checked:
                      checkedListBox1.SetItemCheckState(i, CheckState.Unchecked);
                      break;
                  case CheckState.Indeterminate:
                  case CheckState.Unchecked:
                      checkedListBox1.SetItemCheckState(i, CheckState.Checked);
                       break;
              } 

          }

        }
    }

если все это не то, что вы после ... вы всегда можете просто сделать свой собственный. это довольно простое управление.

7 голосов
/ 05 февраля 2012

Установка SelectionMode в None имеет некоторые странные проблемы, такие как необходимость реализации события Click. Вы можете оставить SelectionMode установленным в single и затем создать класс, который переопределяет CheckedListBox с помощью только OnDrawItem. Обратите внимание, что для того, чтобы отключить выбранный вид, вам нужно отключить состояние «Выбрано» и установить цвета, которые вы хотите. Вы можете получить исходный цвет из элемента управления, как я сделал здесь. Это то, что я придумал, и вы должны начать создавать его так, как хотите.

public partial class EnhancedCheckedListBox : CheckedListBox
{
    /// <summary>Overrides the OnDrawItem for the CheckedListBox so that we can customize how the items are drawn.</summary>
    /// <param name="e">The System.Windows.Forms.DrawItemEventArgs object with the details</param>
    /// <remarks>A CheckedListBox can only have one item selected at a time and it's always the item in focus.
    /// So, don't draw an item as selected since the selection colors are hideous.  
    /// Just use the focus rect to indicate the selected item.</remarks>
    protected override void OnDrawItem(DrawItemEventArgs e)
    {
        Color foreColor = this.ForeColor;
        Color backColor = this.BackColor;

        DrawItemState s2 = e.State;

        //If the item is in focus, then it should always have the focus rect.
        //Sometimes it comes in with Focus and NoFocusRect.
        //This is annoying and the user can't tell where their focus is, so give it the rect.
        if ((s2 & DrawItemState.Focus) == DrawItemState.Focus)
        {
            s2 &= ~DrawItemState.NoFocusRect;
        }

        //Turn off the selected state.  Note that the color has to be overridden as well, but I just did that for all drawing since I want them to match.
        if ((s2 & DrawItemState.Selected) == DrawItemState.Selected)
        {
            s2 &= ~DrawItemState.Selected;

        }

        //Console.WriteLine("Draw " + e.Bounds + e.State + " --> " + s2);

        //Compile the new drawing args and let the base draw the item.
        DrawItemEventArgs e2 = new DrawItemEventArgs(e.Graphics, e.Font, e.Bounds, e.Index, s2, foreColor, backColor);
        base.OnDrawItem(e2);
    }
}
0 голосов
/ 19 февраля 2017

Я немного опоздал, чтобы дать ответ здесь. В любом случае, это снимет все флажки и снимет эффект подсветка :

foreach (int i in clb.CheckedIndices)  //clb is your checkListBox
    clb.SetItemCheckState(i, CheckState.Unchecked);
clb.SelectionMode = System.Windows.Forms.SelectionMode.None;
clb.SelectionMode = System.Windows.Forms.SelectionMode.One;
  • Снимите все флажки
  • Отключить выбор checkListBox
  • Включить выбор checkListBox
0 голосов
/ 04 июля 2014

ох классно добавить поместите весь код из ответа от Hath в

 checkedListBox1_MouseMove(object sender, MouseEventArgs e)

добавить, если кнопка мыши приглушена к переключателю

case CheckState.Checked:
   if (e.Button == MouseButtons.Right)
   {
       checkedListBox1.SetItemCheckState(i, CheckState.Unchecked);
   }                     
   break;

и

case CheckState.Unchecked:
   if (e.Button == MouseButtons.Left)
   {
       checkedListBox1.SetItemCheckState(i, CheckState.Checked);
   }
   break;

и он будет проверять выделенные элементы при перемещении мыши с нажатой левой кнопкой и снимите выделение с правой

...