2010-05-06 5 views
5

해당 이벤트 처리하기 :적절한 데이터 바인딩은 콤보와 내가 같이 보입니다 SQL 서버의 테이블이

ID Code Name  Surname 
1 MS Mike  Smith 
2 JD John  Doe 
3 UP Unknown Person 

등등을 ...

지금 나는이에서 데이터를 바인딩 할을 표를 ComboBox에 ComboBox에서 Code 열의 값을 표시하는 방식으로 변환합니다.

SqlDataAdapter sqlAdapter = new SqlDataAdapter("SELECT * FROM dbo.Users ORDER BY Code", MainConnection); 
sqlAdapter.Fill(dsUsers, "Users"); 
cbxUsers.DataSource = dsUsers.Tables["Users"]; 
cmUsers = (CurrencyManager)cbxUsers.BindingContext[dsUsers.Tables["Users"]]; 
cbxUsers.DisplayMember = "Code"; 

을 그리고이 코드가 작동하는 것 같다 :

것은 나는이 방법으로 바인딩을하고있는 중이 야. 코드 목록을 스크롤 할 수 있습니다. 또한 손으로 코드를 작성하고 ComboBox가 코드를 자동 완성합니다.

그러나 현재 선택된 사용자 코드의 이름과 성을 표시하기 위해 콤보 상자의 맨 위에 레이블을 붙이고 싶습니다.

하지만 그런 식이었다 내 라인 : "그래서, 콤보와 나는 현재의 DataRow를 얻을 것이다 해당 이벤트의 코드 변경 후 불 것이다 이벤트를 찾을 필요가 ..."

나는 콤보 상자의 사건을 탐색하고 있었지만, 성공했지만 성공하지 못했습니다. 예를 들어

는 :

private void cbxUsers_SelectionChangeCommitted(object sender, EventArgs e) 
{ 
if (cmUsers != null) 
{ 
    DataRowView drvCurrentRowView = (DataRowView)cmUsers.Current; 
    DataRow drCurrentRow = drvCurrentRowView.Row; 
    lblNameSurname.Text = Convert.ToString(drCurrentRow["Name"]) + " " + Convert.ToString(drCurrentRow["Surname"]); 
} 
} 

이 나에게 이상한 결과를 제공합니다. 첫째로 마우스 스크롤을 통해 스크롤 할 때 얻을 것으로 예상되는 행을 반환하지 않습니다. 예를 들어 JD에서 "Mike Smith"라고 나에게 보여줍니다. MS에서 "John Doe"를 보여 주며 UP에서 "Mike Smith"를 다시 보여줍니다! 다른 문제는 ComboBox에 입력을 시작하고 Enter 키를 누르면 이벤트가 트리거되지 않는다는 것입니다. 여기

lblNameSurname.DataBindings.Add("Text", dsusers.Tables["Users"], "Name"); 

문제는 내가 단 하나의 열을 결합 할 수 있다는 것입니다 나는이 갖고 싶어 :

그러나, 모든 것이 내가 이런 식으로 lblNameSurname.Text에 데이터를 바인딩 할 때 예상대로 작동합니다. 나는 그것을 위해 두 개의 레이블을 사용하고 싶지 않습니다 (하나는 이름을 표시하고 다른 하나는 성을 표시하는 것입니다).

그래서 내 문제에 대한 해결책은 무엇입니까?

또한 ComboBox에서 데이터 선택과 관련된 한 가지 질문이 있습니다. 자, 콤보 상자에 뭔가를 입력하면 목록에없는 글자를 입력 할 수 있습니다. 예를 들어, "J"를 입력하고 "D"로 끝내기보다는 "JD"를 입력하고 "Jsomerandomtexthere"를 입력하십시오. 콤보 박스 (combobox)는 그것을 허락 할 것이지만 그러한 아이템은리스트에 존재하지 않습니다. 즉, 사용자가 코드 목록에없는 코드를 입력하는 것을 막기 위해 콤보 박스를 원합니다. 두 번째 질문에 대한

답변

2

그냥 이것에 대한 테스트를 직접 해봤는데, 당신이 찾고있는 것이 잘못된 이벤트 (어쩌면 잘못된 객체)에 묶여 있다고 생각합니다.

방금 ​​CurrencyManager 개체 (cmUsers)의 PositionChanged 처리기에 이벤트를 추가하려고 시도했지만 의도 한대로 작동했습니다. 첫 번째 항목이 레이블에 바인딩되지 않도록 PositionChanged를 누르지 않습니다. (더 쉬운 수정이있을 것입니다). http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingmanagerbase.positionchanged.aspx

먼저 해고되는 이벤트를 확인하기 위해 약간의 테스트를 실행하고, 아직 내부 위치를의 업데이트하지 않았습니다 CurrencyManager의를 의미 PositionChanged 전에 발사 SelectionChangeCommitted 이벤트를 것 같다, 그래서 라인 :

DataRowView drvCurrentRowView = (DataRowView)cmUsers.Current; 

잘못된 DataRow를 당깁니다.

두 번째 문제를 잊어 버렸습니다. 대부분의 컨트롤은 키 누르기를 처리하지 않으므로 OnKeyDown 또는 OnKeyPress 이벤트를 바인딩하여 원하는 모든 함수 (예 : FindString())와 연결된 인덱스를 찾고 ComboBox.SelectedIndex 속성을 발견 된 색인, 그렇지 않으면 경고를 플래시). 예를 들어 :

if(e.KeyCode == Keys.Enter) 
{ 
    int indx; 
    cmbBox.SelectAll(); 
    if((indx = FindString(cmbBox.SelectedText)) != -1) 
     cmbBox.SelectedIndex = indx; 
    else 
     // Some warning 
} 

편집 귀하의 의견을 읽은 후 , 나는 확인을 할 수있는 쉬운 방법을 생각.ComboBox의 "KeyPress"이벤트에서 다음 코드를 사용하십시오.

if(e.KeyChar != (char)Keys.Enter) 
{ 
    if(cmbBox.FindString(cmbBox.Text + e.KeyChar) == -1) 
    { 
     e.Handled= true; 
    } 
} 

번거롭지 않고 불쾌하지 않습니다. 여기서 목록에있는 항목 만 제한하므로 Enter 키를 누를 때 처리 할 필요가 없습니다. 선택한 항목을 자동으로 변경해야하기 때문입니다 (단, 일부 유효성 검사를 실행하여 적절한 항목인지 확인하는 것이 좋습니다. cAsE 또는 Enter keypress에서 SelectedIndex 속성을 수동으로 변경). 아직도 도움이 되었기를 바랍니다.

+0

관심을 가져 주셔서 감사 드리며,이 문제를 다시 한번 살펴 보겠습니다. – Wodzu

+0

당신은 옳았습니다. 여러분은 저에게 이것을 다시 한번 생각하게하고 bindingSource (CurrencyManager를 노출하는) 이벤트를 추가했습니다. 그들을 통해 나는 그 일을 성취 할 수 있었다. – Wodzu

0

나는 일반적으로 그것이 내가 양식을 떠나기 전에 콤보 상자에 대한 Validating 이벤트를 처리 (비활성화 버튼을 계속하거나 오류 메시지를 던져) 또는 ComboBoxStyle.DropDownList

ComboBox.DropDownStyle 설정 중 하나입니다 수행 두 가지 방법
+0

감사합니다. 나는 그 해결책들 중 어느 것도 나에게 좋지 않다고 생각하지 않는다. 늘어나는만큼 DropDownList에 대한 스타일을 변경하면 타이핑이 불가능 해지고 나는 그것을 원하지 않는다는 것을 알고 있습니다. 목록에있는 것들만 타이핑하는 것을 제한하고 싶습니다. 하지만 KeyPress 이벤트에서 자체 유효성 검사를 작성할 수 있다고 생각합니다. – Wodzu

0

글쎄, 이름과 성을 하나의 열로 가져 오도록 SQL을 변경 한 다음 해당 열에 한 번 바인드 할 수 있습니다. 또한 Ajax 업데이트 패널에 콤보와 라벨을 넣을 것입니다.

유효성 : 클라이언트에서 유효성을 검사하려면 클라이언트에서 가능한 모든 값을 미리 가져야하며, 각 문자에 대해 다시 게시하고 (아마도 좋은 생각이 아닌 - 서버를 죽이는) SQL을 누르십시오.

자동 완성 상자를 사용할 수 있습니까? 예를 들어, jQuery의 autocompletebox를보십시오.

0

다음을 시도하십시오.

Binding 개체를 참조하도록 수동으로 만듭니다. Binding 개체를 사용하여 ComboBox의 SelectedItem 속성에 바인딩합니다. 나는 이것이 당신에게 선택된 DataRow를 가져다 줄 것이라고 생각한다. 해당 Binding 개체를 레이블의 DataBindings 컬렉션에 추가하십시오.

Binding.Format 이벤트 처리 (또는 Parse - 어떤 방향으로 바인딩 할 때 어떤 이벤트가 적용되는지 잘 기억하지 못할 수 있음) 이벤트 args 개체에서 수신 한 DataRow 개체를 사용하여 적절한 이름 문자열을 포함합니다. 이름과 성 모두. EventArgs의 다른 속성을 해당 문자열로 설정해야합니다.

Binding 클래스의 FormattingEnabled 속성으로 재생해야 할 수도 있습니다. 마지막으로이 작업을 수행한지 얼마되지 않았습니다. 조금 까다 롭습니다. 당신은 당신이 선택을 변경하고 외부를 클릭하거나 탭 키를 눌러처럼 드롭 다운의 외부에서 포커스를 이동 http://msdn.microsoft.com/en-us/library/system.windows.forms.binding_events.aspx

0

보통 드롭 다운 선택된 인덱스 변화의 이벤트가 발생합니다

는 구문 분석 및 형식 이벤트에 대한 설명서를 참조하십시오 ...

당신이 즉시 트리거해야 할 경우 다른 이벤트를 구하거나 를 통해 이벤트를 호출 할 필요가 자바 스크립트를 onchange를 이벤트, 등 ...

관련 문제