WinForm에서 ComboBox에서 바인딩된 객체 세트에 대한 SelectedValue 보충 정보를 가져옵니다.
8190 단어 combobox
참고: 본고는 귀속 대상 집합만 한정하고 귀속 데이터셋이나 데이터테이블의 상황은 언급하지 않습니다
(DataSet을 바인딩할 때 SelectedValue가 System.Data.DataRowView로 변환되는 오류나 SelectedVlaue의 값을 변환할 때 '대상을 문자열로 변환할 수 없음' 이 나타나면 여기 보십시오: Combobox에 System.Data.DataRowView가 발생하는 원인, ValueMember를 지정하는 시기 문제 http://blog.csdn.net/lubiaopan/archive/2010/09/30/5915774.aspx)
1. 준비 작업: 편의를 위해 우리는 잠시 공용 방법과 변수를 간소화한다.
하나의 Area 클래스:
#region Area
public class Area
{
private string m_Area_ID;
public string Area_ID
{
get { return m_Area_ID; }
set { m_Area_ID = value; }
}
private string m_Area_Name;
public string Area_Name
{
get { return m_Area_Name; }
set { m_Area_Name = value; }
}
private double m_Area_Order;
public double Area_Order
{
get { return m_Area_Order; }
set { m_Area_Order = value; }
}
}
#endregion
[Serializable]
public class AreaLists : List
{
private int _maxItems = 0;
public int MaxItems { get { return this._maxItems; } set { this._maxItems = value; } }
}
하나의 WinForm, 이름은frmMain
하나의 ComboBox, cbList
두 개의 button, 이름은 btnSetCombobox와 btnGetSelectedValu
lbResult라는 이름의 Label, 초기값은 Unknown
공통 변수를 정의하려면 다음과 같이 하십시오.
AreaLists ac;
public AreaLists GetTestArea()
{
AreaLists al = new AreaLists();
for (int i = 1; i < 11; i++)
{
Area a = new Area();
a.Area_ID = i.ToString();
a.Area_Name = "제"+ i.ToString() + "이름"
al.Add(a);
}
return al;
}
다음과 같은 몇 가지 방법이 사용됩니다.
방법 1: SetValueByValue(ValueMember 설정을 통해)
private void SetValueByValue()
{
Area a = new Area();
a.Area_ID = "8";
a.Area_Name = "8위",
cbList.SelectedValue = a.Area_ID;
lbResult.Text = cbList.SelectedValue.GetType().ToString() + ":"+ cbList.SelectedValue.ToString();
}
방법2: SetValueByItem(SelectedItem 설정)
private void SetValueByItem()
{
Area a = new Area();
a.Area_ID = "8";
a.Area_Name = "8위",
cbList.SelectedItem = ac.FindAll(delegate(Area ar) { return ar.Area_ID == a.Area_ID; })[0];
lbResult.Text = cbList.SelectedItem.GetType().ToString() + ":"+ cbList.SelectedValue.ToString();
}
방법3: SetValueByText(FindString을 통해 DisplayMember 설정 찾기)
private void SetValueByText()
{
Area a = new Area();
a.Area_ID = "8";
a.Area_Name = "8위",
cbList.SelectedIndex = cbList.FindString(a.Area_Name);
lbResult.Text = cbList.SelectedValue.GetType().ToString() + ":"+ cbList.SelectedValue.ToString();
}
SelectedValue 값을 가져오려면:
private void GetValueByValue()
{
lbResult.Text = cbList.SelectedValue.GetType().ToString() + ":"+ cbList.SelectedValue.ToString();
}
다음 그림은 다음과 같습니다.
frmMain의 PageLoad 이벤트:
private void frmMain_Load(object sender, EventArgs e)
{
ac = GetTestArea();
cbList.DataSource = ac;
cbList.ValueMember = "Area_ID";
cbList.DisplayMember = "Area_Name";
}
btnSetCombobox의 Click 이벤트:
private void btnSetCombobox_Click(object sender, EventArgs e)
{
//사용 방법 1:
SetValueByValue();
//사용법 2
//SetValueByItem();
//사용법 3
//SetValueByText();
}
btnGetSelectedValue의 Click 이벤트:
private void btnGetSelectedValue_Click(object sender, EventArgs e)
{
GetValueByValue();
}
cbList SelectedIndexChanged
SelectedValueChanged
:
2. 테스트 결과(귀속 결과가 비어 있을 때 고려하지 않음)
사용법
1. ComboBox의 SelectedIndexChanged 이벤트와 SelectedValueChanged 이벤트가 설정되지 않았을 때 SelectedValue 유형 및 값
Page_Load 시
SelectedValue 설정
SelectedValue 읽기
SetValueByValue
Null
선택한 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
SetValueByItem
Null
Area
선택한 AreaID에 해당하는 문자열
SetValueByText
Null
선택한 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
사용법
2. ComboBox의 SelectedIndexChanged 이벤트 SelectedValue 유형과 값만 설정
Page_Load 시
SelectedValue 설정
SelectedValue 읽기
SetValueByValue
첫 번째 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
SetValueByItem
첫 번째 AreaID에 해당하는 문자열
Area
선택한 AreaID에 해당하는 문자열
SetValueByText
첫 번째 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
사용법
3. ComboBox의 SelectedValueChanged 이벤트만 설정할 때 SelectedValue 유형과 값
Page_Load 시
SelectedValue 설정
SelectedValue 읽기
SetValueByValue
첫 번째 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
SetValueByItem
첫 번째 AreaID에 해당하는 문자열
Area
선택한 AID에 해당하는 문자열
SetValueByText
첫 번째 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
선택한 AID에 해당하는 문자열
사용법
4. ComboBox의 SelectedIndexChanged 이벤트와 SelectedValueChanged 이벤트를 동시에 설정할 때 SelectedValue 유형과 값
Page_Load 시
SelectedValue 설정
SelectedValue 읽기
SetValueByValue
첫 번째 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
SetValueByItem
첫 번째 AreaID에 해당하는 문자열
Area
선택한 AreaID에 해당하는 문자열
SetValueByText
첫 번째 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
선택한 AreaID에 해당하는 문자열
2. 결론(귀속 결과가 비어 있을 때 고려하지 않음)
이번 테스트에서는 다음과 같은 몇 가지 결론이 발견되었습니다.
1. ComboBox에서SelectedIndexChanged 이벤트와SelectedValueChanged 이벤트를 설정하든지 않든지 SelectedValue 값을 설정하지 않거나ValueMember의 범위(즉 오류 값)를 초과하지 않으면 SelectedValue는 첫 번째 대상에 대응하는AreaID 값입니다. 따라서 원하는 값을 제대로 가져오지 못한 경우 ValueMember 컬렉션에 없는 값이 설정되었는지 확인하십시오.
2. ComboBox의 SelectedIndexChanged 이벤트와 SelectedValueChanged 이벤트를 설정하고 이벤트에서 SelectedValue 값을 가져오는 것이 좋습니다.
사건이 촉발될까 봐 걱정하는 사람이 있습니까?두 이벤트가 동시에 설정된 경우 다음 순서로 테스트됩니다.
cbList.DataSource = ac;//SelectedValueChanged 이벤트와 SelectedIndexChanged 이벤트를 한 번씩 트리거합니다.cbList.ValueMember = "Area_ID";SelectedValueChanged 이벤트와 SelectedIndexChanged 이벤트를 각각 한 번씩 터치하고, SelectedValueChanged 이벤트 cbList를 한 번씩 터치합니다.DisplayMember = "Area_Name";SelectedValueChanged 이벤트와 SelectedIndexChanged 이벤트를 한 번씩 트리거합니다.다시 말하면 두 개의 이벤트 중 하나를 설정하면 됩니다. 저는 SelectedValueChanged 이벤트를 사용하는 것을 권장합니다.
3. 정확한 귀속 순서를 설정한다.정확한 순서는 다음과 같다는 지적이 나왔다.
cbList.ValueMember = "Area_ID ";//SelectedValueChanged 이벤트가 트리거됩니다.
cbList.DisplayMember = "Area_Name ";//여기서는 어떤 사건도 일으키지 않습니다
cbList.DataSource = ac;//SelectedValueChanged 이벤트와 SelectedIndexChanged 이벤트를 한 번씩 트리거합니다.
이번 테스트에서 순서가 결과에 영향을 미치지 않는 것을 발견했지만 DataSource를 설정하기 전에 ValueMembe를 설정하면 트리거 이벤트가 크게 감소합니다!
DataSource를 설치하기 전에 Value Member와 Display Member를 설정하는 것이 좋습니다.
4. 만약에 잘못된 Display Member 이름을 설정하면 (예를 들어 본고의 "Area Names"가 "Area Names"로 잘못 설정된 경우) Value Member를 Display Member로 하고 Value Member의 이름도 잘못 설정한 경우(예를 들어 본고의 "Area ID"가 "Area IDs"로 잘못 설정한 경우) SelectedValue를 가져오는 오류가 발생합니다!
5. 본문의 시작으로 돌아가서 만약에 대상집이 아니라 DataSet이나 DataTable가 귀속되어 있다면 SelectedValue를 설정하지 않았을 때 null이 아닌 DataRowView를 얻었으니 주의하십시오.
: CSDN , 。
! [email protected]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ExtJs의 ComboBox 트랩[size=xx-large] 업무 수요로 인해 최근에 extjs 프레임워크를 사용하는 것을 배우기 시작했다.일주일여 동안 거의 2주일 동안 이것저것 익히고 일을 시작했다. 예를 들어 처음에는 함수로 패널을 생성하는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.