2010-01-19 4 views
9

작업중인 작은 응용 프로그램에서 CheckedListBox 컨트롤을 사용하고 있습니다. 그것은 좋은 통제이지만, 한가지는 저를 귀찮게합니다; 실제로 확인란을 선택했을 때 항목 만 검사하도록 속성을 설정할 수 없습니다. 이 문제를 극복하는 가장 좋은 방법은 무엇입니까? 나는 체크 상자의 왼쪽에서 친숙한 mouseclick의 위치를 ​​얻으려고 생각 해왔다. 부분적으로 작동하지만 왼쪽에 충분히 가까운 빈 공간을 클릭하면 현재 선택한 항목이 계속 확인됩니다. 이것에 관한 아이디어가 있습니까?CheckedListBox 컨트롤 - 실제 확인란을 클릭 할 때 확인란 만 선택합니다.

+0

아마도 뭔가가 빠졌습니다. 상자를 확인하면 지금 무슨 일이 벌어지고 있습니까? 아무것도? 기본적으로 무언가를 확인하고 있습니까? 무슨 일이 일어나고 싶지 않으세요? – hunter

+0

상자를 클릭 할 때 상자가 선택 되기만 원할뿐입니다. 다음과 같이 상상해보십시오 : [] Item1 현재 전체 항목을 클릭하면 상자가 선택되지만 원하는 것은 아닙니다. 나는 상자 자체를 클릭 할 때만 클릭하기를 원합니다. 옆에 설명이있는 텍스트가 아니라 클릭하기를 원합니다. – Oxymoron

+0

당신은 여분의 레이블, 단지 체크 박스리스트를 사용하고 레이블을 만들 수 있습니다 .. 그것은 훌륭하게 해결되었지만 작동합니다 :> – Tyzak

답변

7

음, 꽤 추한,하지만 당신은 내가이 스레드가 조금 오래된 알고 다음

/// <summary> 
/// In order to control itemcheck changes (blinds double clicking, among other things) 
/// </summary> 
bool AuthorizeCheck { get; set; } 

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    if(!AuthorizeCheck) 
     e.NewValue = e.CurrentValue; //check state change was not through authorized actions 
} 

private void checkedListBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Point loc = this.checkedListBox1.PointToClient(Cursor.Position); 
    for (int i = 0; i < this.checkedListBox1.Items.Count; i++) 
    { 
     Rectangle rec = this.checkedListBox1.GetItemRectangle(i); 
     rec.Width = 16; //checkbox itself has a default width of about 16 pixels 

     if (rec.Contains(loc)) 
     { 
      AuthorizeCheck = true; 
      bool newValue = !this.checkedListBox1.GetItemChecked(i); 
      this.checkedListBox1.SetItemChecked(i, newValue);//check 
      AuthorizeCheck = false; 

      return; 
     } 
    } 
} 
+0

그래, 내가 방공호에서 말했듯이, 이것에 대해서도 생각하고 있었지만, 기분이 좋지 않아 대체물을 찾기 시작했다. :) – Oxymoron

+2

고마워, 그냥 작동 해! 몇 가지 최적화가 가능하지만 그 아이디어는 효과가 있습니다! – nightcoder

0

CheckedListBox의 확인란 텍스트는 기본적으로 확인란 입력 후 HTML 레이블을 배치하고 레이블의 "for"특성을 확인란 ID로 설정합니다.

레이블이 "for"인 요소를 나타내는 경우 해당 레이블을 클릭하면 브라우저에 해당 요소 (즉,보고있는 요소)에 초점을 맞 춥니 다.

두 가지 옵션은 목록이 정적 인 경우 별도의 CheckBox 컨트롤과 텍스트 (CheckBox의 Text 속성이 아닌 CheckBoxList와 동일 함)로 자체 목록을 렌더링하는 것이지만 Repeater 목록이 동적 인 경우. '

+0

그것은 웹 폼이 아니라 winform입니다. 그러나 나는 당신의 드리프트를 얻습니다. 초점을 맞추는 것이 좋고 실제로 원하는 것입니다. 항목 자체를 클릭 할 때 확인란을 선택하지 않기를 바랍니다. 사용자 정의 컨트롤을 사용하여 주변을 둘러 볼 것 같습니다. – Oxymoron

+0

태그가있는 경우에만 C# 및 CheckedListBox가 있었는지 확인하기가 어렵습니다. 나는 앞서 가서 winform을 추가했다. –

9

처럼 CheckedListBox.MouseDownCheckedListBox.ItemCheck에 접선에 의해 히트 항목의 사각형에 좌표 마우스를 계산할 수 있지만, 내가 돈

private void checkedListBox1_MouseClick(object sender, MouseEventArgs e) 
{ 
    if ((e.Button == MouseButtons.Left) & (e.X > 13)) 
    { 
     this.checkedListBox1.SetItemChecked(this.checkedListBox1.SelectedIndex, !this.checkedListBox1.GetItemChecked(this.checkedListBox1.SelectedIndex)); 
    } 
} 

(CheckOnClick = True의 값) : t은 다른 솔루션을 제공하는 문제를 생각합니다.

너는 직사각형에 그 물건을 사용할 수 있지만, 왜 그것을 더 복잡하게 만드는지.

5

다른 해결책은 단순히 Treeview를 사용하는 것입니다.
CheckBoxes를 true, ShowLines을 false, ShowPlusMinus를 false로 설정하면 CheckedListBox와 기본적으로 동일합니다. 항목은 실제 CheckBox를 클릭 할 때만 선택됩니다.

CheckedListBox는 훨씬 단순하지만 TreeView는 프로그램에 더 적합한 옵션을 많이 제공합니다.

0

시도해보십시오. iLastIndexClicked를 폼 수준의 int 변수로 선언하십시오.

private void chklst_MouseClick(object sender, MouseEventArgs e) 
{ 
    Point p = chklst.PointToClient(MousePosition); 
    int i = chklst.IndexFromPoint(p); 
    if (p.X > 15) { return; } // Body click. 
    if (chklst.CheckedIndices.Contains(i)){ return; } // If already has focus click anywhere works right. 
if (iLastIndexClicked == i) { return; } // native code will check/uncheck 
    chklst.SetItemChecked(i, true); 
    iLastIndexClicked = i; 
} 

그냥 사용자가 체크리스트 (체크 박스 영역)의 왼쪽에 15 개 픽셀을 클릭 있는지 확인

은 현재 선택한 항목을 다시 검사를 제외한 모든 시간에 작동합니다. 마지막 인덱스를 저장하고 변경하지 않고 종료하면 네이티브 코드가 제대로 처리하도록 설정하고,이 경우에 체크하도록 설정하려고하면 "ItemCheck"코드가 실행될 때 다시 꺼집니다.

관련 문제