문제

DataTable을 사용하여 XML 파일에서 Combobox에 항목을 채우고 있습니다. 현재 하나의 열이 ComboBox의 DisplayMember이고 다른 열은 값 멤버입니다. 그러나 선택한 시합 매개 변수를 설정해야하므로 값 멤버가 고유하지 않을 수 있기 때문에 이것이 항상 작동하지 않을 수 있습니다.

테이블에 값 멤버의 복제본이 있는지 여부는 모르겠습니다. 따라서 내 아이디어는 전체 데이터를 Combobox의 값 멤버로 넣은 다음 ComboBox.SelectedItem = (DatArow) 일부 _data_row를 사용한다는 것입니다. 선택하려면 항상 오른쪽 Combobox 객체를 선택합니다.

이것을 어떻게 달성 할 것인가? 더 좋은 방법이 있습니까? 나는 제안에 개방적이지만, 디스플레이 멤버와 가치 멤버 모두에게 갈 수있는 것이 매우 중요합니다.

도와 주셔서 감사합니다!

편집하다: 어쩌면 나는 전에 충분히 명확하지 않았지만, 이것이 가장 좋은 접근법인지 묻는 동안 나는 또한 어떻게 이것을하기 위해. valuemember 매개 변수를 설정하지 않으면 selectedItem은 DatarOwview 유형입니다 ... selectedValue 매개 변수를 사용하여 Combobox에서 항목을 선택하고 값 멤버를 명시 적으로 설정하지 않고이를 수행하려는 경우 예외가 발생합니다.

도움이 되었습니까?

해결책 2

우선 Adam Robinson에게 감사합니다. 귀하의 대답이 정확했다고 확신하지만, 내가 듣고 싶었던 것은 아니 었습니다. 나는 다른 방식으로 내 문제를 해결했으며 다른 사람에게 유용 할 수 있다고 생각하기 때문에 여기에 게시하고 있습니다.

내가 한 일은 새 수업을 만들었습니다. 제 경우에는 listobject라는 이름을지었습니다. 가치 속성). 또한 방법을 무시합니다.

  • 문자열 toString ()
  • bool Equals (Object OBJ)
  • int gethashcode () -내 경우에는 필요하지 않지만 Visual Studio
    그것은 당신에게 그것을 무시해야한다고 경고합니다.

아이디어는 combobox.items 컬렉션을 내 자신의 클래스의 객체로 채울 수 있다는 것입니다. 사용자 정의 문자열을 표시합니다 (이와 같이 작업하지 않았다면 스택 오버플로에 대한 다음 질문은 아마도 항목을 읽을 때 디스플레이 멤버를 사용자 정의하는 것일 것입니다. Datarow) 및 한 클래스의 항목 만 비교하십시오 (내 경우 Datarow).

여기에 코드가 있으며 적어도 잘 작동합니다 (적어도 내가하고 싶었던 것에 대해).

public class ListObject
{
    public DataRow element;

    public String DisplayObject = null;

    public ListObject(DataRow dr)
    {
        element = dr;
    }

    public ListObject(DataRow dr, String dspObject)
    {
        element = dr;
        DisplayObject = dspObject;
    }

    public override String ToString()
    {
        if (DisplayObject == null) throw new Exception("DisplayObject property was not set.");

        return element[DisplayObject].ToString();
    }

    public override bool Equals(object obj)
    {
        if (obj.GetType() == typeof(ListObject))
            return Equals(((ListObject)obj).element, this.element);
        else return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}

제 경우에는 Combobox의 Foreach 진술을 채울 수 있기 때문에 훌륭하게 작동합니다.

dtUsers.ReadXml(Program.Settings.xmlInputUsers);

foreach(DataRow dr in dtUsers.Rows) 
{
    cmbUser.Items.Add(new ListObject(dr, "Name"));
}

그리고 Datarow를 선택하면 선택한 것을 원합니다.

cmbUser.SelectedItem = new ListObject(dlg.SelectedDataRow);

DataRow 만 비교되므로 DisplayMember 등에 대해 걱정할 필요가없는 경우 ComboBox.Items Collection을 채울 때부터 디스플레이 매개 변수가 여전히 설정됩니다. 또한 Tostring 메소드가 재정의되므로 출력을 실제로 사용자 정의 할 수 있습니다.

이 수업을 만드는 것은 MSDN 기사 때문에 가능했습니다. combobox.SelectedItem 속성 여기에서, 선택된 시합 속성은 indexof 메소드를 사용하여 작동한다는 점에 주목했다. 이 방법은 평등 방법을 사용하여 평등을 결정합니다.

다른 팁

당신이 묶인 경우 ListBox a DataTable, 당신은 실제로 그것을 a에 묶고 있습니다 DataView 그것은 그것을 나타냅니다 DataTable (DataTable 구현 IListSource, 그리고 그것은 반환합니다 DataView). 직접 설정할 수 없습니다 SelectedItem a DataRow 예를 들어, a로 설정해야합니다 DataRowView 사례. 불행히도 쉽게 얻는 방법은 없습니다 DataRowView a DataRow.

당신은 DataRowView. 이것은 당신이 설정할 수있게합니다 SelectedItem 명시 적으로.

당신은 사용할 수 없습니다 SelectedValue 속성, 사용해야합니다 SelectedItem 이것을 위해.

이것은 Combobox에 데이터를 사용할 수있는 가장 간단한 방법입니다.

private void load() { 
DataTable dt = // get data from DB 
comboBox1.ValueMember = null; // allows you to get all fields in the obj to combobox
comboBox1.DisplayMember = "ccType";//label displayed from dt
comboBox1.DataSource = dt;
}
//to test 
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
    {

        DataRowView current = (DataRowView)comboBox1.SelectedValue;
        string drs = current.Row["ID"].ToString();

    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top