2011-12-15 5 views
1

저는 C#, winforms를 사용하고 있습니다.combobox에서 선택한 값을 얻으십시오

작은 문제가 발생했습니다. 나는 가능한 한 많이 디버깅하여 내가 사용중인 코드가 문제를 일으키는 것으로 믿게한다. 그래, 쿼리의 데이터로 채워진 콤보 상자가 있습니다.

"name"과 "keycode"의 2 개의 열이 있습니다.

accCollection.DisplayMember = "name"; 

다음 이름을 사용하여 이름에 해당하는 키 코드 값을 가져옵니다.

string acct = accCollection.SelectedValue.ToString(); 

문제는 키 코드가 이름과 일치하지 않는다는 것입니다. 비록 이것이 comboBox를 채우기 전에 데이터 그리드 뷰에 쿼리 결과를 디스플레이하는 것이 었습니다. 데이터 그리드보기는 올바른 결과를 표시하여 잘못된 코드를 사용하고 있다고 믿게합니다!

여러분이 더 많은 코드를 알려 주시면이 게시물을 편집하겠습니다. 당신은 내가 이미 데이터 멤버에게

accCollection.DataSource = myTable; 
accCollection.DisplayMember = "name"; 
accCollection.ValueMember = "keycode"; 

UPDATE를 할당 :::: 확인 좀 더 많은 정보를 볼 수

업데이트를 heres 코드 내가 언급하는 것을 잊었다. 선택된 값은 이름 계좌 번호 인 1557이어야합니다. 하지만 나는 다른 계좌 번호 인 1855를 얻는다. 내가 datatable가 정확하다고 .... 이런 식으로 왜 내가 너무 sooooooo 혼란스러워!

업데이트 : : heres 일부 코드 그래서 당신은 정보로 콤보 상자를 업데이트하는 방법을 볼 수 있습니다!

그런 다음 다른 쿼리를 호출하는 다음 작업을 수행합니다.

private void button1_Click_1(object sender, EventArgs e) 
{ 
    checkBox1.Checked = true; 
    string acct = accCollection.SelectedValue.ToString(); 

    Task t = new Task(() => GetsalesFigures(acct)); 
    t.Start(); 
} 

업데이트 : 그냥 데이터를 표시합니다. enter image description here

그래요. 디버깅에 도움이 된 후에는 다음 코드를 사용하여 이러한 결과를 얻었습니다.

var result = accCollection.SelectedValue; 
if (result != null) 
{ 
    MessageBox.Show(result.ToString()); 
} 

을 잘못 1885는 =하지만이 작업을 수행 할 때.

DataRowView row = (DataRowView)accCollection.SelectedItem; 
if (row != null) 
{ 
    MessageBox.Show(row[0] + " " + row[1]); 
} 

의 쇼 정확한 데이터 "멜 크샴", "1557"

는 이유는?

+1

그래서 'accCollection.SelectedValue.ToString()'의 결과는 무엇입니까? 당신이 얻는 키 코드는 무엇입니까? – Otiel

+0

에는 이미 값 멤버가 할당되어 있습니다. – lemunk

답변

3

SelectedValue 또는 SelectedItem 속성을 사용할 수 있지만 반환 값이 null인지 여부도 확인해야합니다.

DataTable을 바인딩하면 SelectedItem 속성은 DataRowView를 반환합니다. SelectedValue의 경우

DataRowView row = (DataRowView)accCollection.SelectedItem; 
if(row!=null) 
{ 
    MessageBox.Show(row[0] + " " + row[1]); 
} 

,

var result = accCollection.SelectedValue; 
if (result != null) 
{ 
    MessageBox.Show(result.ToString()); 
}   

편집 : Form_Load 이벤트에서

코드 :

private void Form1_Load(object sender, EventArgs e) 
{ 
    DataTable dt = new DataTable(); 
    dt.Columns.Add("A1", typeof(int)); 
    dt.Columns.Add("A2"); 
    dt.Rows.Add(1, "A"); 
    dt.Rows.Add(2, "B"); 

    comboBox1.DataSource = dt; 
    comboBox1.DisplayMember = "A2"; 
    comboBox1.ValueMember = "A1"; 
} 

코드 버튼의 클릭 핸들러 :

var result = comboBox1.SelectedValue; 
if (result != null) 
{ 
    MessageBox.Show(result.ToString()); 
} 


DataRowView row = (DataRowView)comboBox1.SelectedItem; 
if (row != null) 
{ 
    MessageBox.Show(row[0] + " " + row[1]); 
} 
+0

ive 값이 표시되고 값이 – lemunk

+1

이되어야합니다. @StevenSmith - 데이터베이스 결과가 잘못되었을 수 있습니다. SelectedItem 속성은 항상 기본 DataSource의 DataRow를 반환합니다. 키 코드는 고유합니까? – adatapost

+0

정확하게 내 포인트, dbo는 100 % 정확하며, 쿼리는 100 % 정확합니다. 필자도 확인하려면 DataGrid에 표시했습니다. 하지만 콤보 상자에서 값을 가져올 때, 그 잘못된 ........ 사람이 인스턴트 메시징 – lemunk

3

몇 가지 :

  1. DisplayMember 속성은 컬럼의 이름이어야는 콤보 상자 안에 표시합니다.
  2. ValueMember 속성은 항목의 값인 열의 이름이어야합니다.

    string acct = accCollection.SelectedText; 
    

자세한 것은 this를 참조하십시오

string acct = accCollection.SelectedValue.ToString(); 

는 다음과 같이 표시 텍스트를 가져옵니다 :

accCollection.DisplayMember = "name"; 

accCollection.ValueMember = "key"; 

당신이 선택한 항목의 값이 사용되어야합니다.

+0

그리고 선택한 항목의 표시 텍스트를 얻으려면 : 'string accText = accCollection.SelectedText;' – Otiel

+0

은 이미 값 멤버가 지정되어 있습니다. – lemunk

+0

@Otiel : 좋은 포인트가 업데이트되었습니다. – Muse

0

DataTable & 저는 데이터 유형을 표시하기 위해 dataTable을 콤보 상자에 바인딩하는 데 사용되었으며 데이터 테이블에있는 제목 ID를 변수에 가져 오려고했습니다.

 cmbTitle.DataSource=dataTable; 
     cmbTitle.DisplayMember="title_type"; 
     cmbTitle.ValueMember="id"; 

는 cmbtitle의 선택 변경 이벤트, 내가 문자열로 선택된 값 멤버를 가지고하고 외래 키와 같이 다시 데이터베이스에 저장하는 정수로의 구문 분석.

private void cmb_title_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     string userTitle = cmb_title.SelectedValue.ToString();    
     int.TryParse(userTitle, out this.userTitle); 
     MessageBox.Show(this.userTitle.ToString());    
    } 
관련 문제