2014-07-16 5 views
0

SpinEdit (숫자 업/다운) 컨트롤과 ComboBoxEdit가 포함 된 사용자 컨트롤에서 작업하고 있습니다. 콤보 상자에서 선택한 옵션은 SpinEdit의 숫자에 곱 해줄 요소를 제공합니다.동일한 항목이 포함 된 여러 ComboBoxEdit 컨트롤

잘 작동
public class MyUserControl : DevExpress.XtraEditors.XtraUserControl 
{ 
    private static List<String> listItems; 
    static MyUserControl() // Populate the list of options with the default options 
    { 
     listItems = new List<String?(); 
     listItems.Add("Option1"); 
     listItems.Add("Option2"); 
     listItems.Add("Option3"); 
    } 

    public MyUserControl() 
    { 
     InitializeComponent(); 

     // Add default options to the combo box 
     foreach (String item in listItems) 
     { 
      this.cboBox.Properties.Items.Add(item); 
     } 
    } 
} 

(위의 정적 목록은 배율로 문자열을 매핑하는 정적 사전은 현실에서, 단순화되어 있습니다) 내가 원하는 것을 제외 : 지금이 순간, 나는 이런 식으로 뭔가를 사용자가 listItems에 사용자 지정 옵션을 추가 할 수있게하고 내 응용 프로그램의이 사용자 정의 컨트롤의 모든 인스턴스에이 옵션이 표시되도록합니다. 그 이유는 listItems이 모든 컨트롤에 나타날 수 있도록 this.cboBox.Properties.Items = listItems;을 추가하기를 바랬 기 때문에 listItems이 정적 인 이유입니다. 그러나 Items 속성은 읽기 전용이므로 수행 할 수 없습니다.

내 사용자 정의 컨트롤의 모든 인스턴스가 변경된 경우에도 동일한 옵션 집합을 갖도록하려면 어떻게해야합니까? 사용자가 옵션 목록을 변경할 때 정적 멤버가 이벤트를 발생 시키면 트릭을 수행 할 수 있지만 이는 이처럼 간단한 것처럼 과장 될 수 있습니다. 누구든지 다른 아이디어가 있습니까?

답변

0

ComboBoxEdit 대신 LookUpEdit 컨트롤을 사용하는 것이 좋습니다. 그냥 몇 가지 조정 :

lookUpEdit1.Properties.DataSource = listItems; 

을하지만 DataSourceDictionary 몇 가지 문제가있다 : 당신은 그 방법으로 listItems을 사용할 수 있습니다

lookUpEdit1.Properties.ShowHeader = false; 

. DataSource의 경우 IList, ITypedList 또는 IBindingList 인터페이스를 구현하는 컬렉션을 사용해야합니다. 그래서, 당신은 당신의 DictionaryList에 변환 할 수 있습니다 또는 당신이 트릭 사용할 수 있습니다

private static Dictionary<int, string> items; 

//... 

lookUpEdit1.QueryPopUp += lookUpEdit_QueryPopUp; 
lookUpEdit2.QueryPopUp += lookUpEdit_QueryPopUp; 

//... 

private void lookUpEdit_QueryPopUp(object sender, CancelEventArgs e) 
{ 
    var lookUpEdit = (LookUpEdit)sender; 

    lookUpEdit.Properties.DataSource = null; 
    lookUpEdit.Properties.DataSource = items; 
} 

을하지만 List 대신 Dictionary을 사용하는 것이 좋습니다 생각합니다.

+0

고맙습니다. 고맙습니다. 조회 편집으로 변경했습니다. 그러나, 나는 아직도 그것을 작동시키지 못합니다. 어쩌면 내가 OP에서 말했듯이, 정적 목록은 정적 사전입니다 (사전에 물어볼 때마다 동일한 객체의 사전 등록 된 Values ​​속성입니까, 아니면 반환 할 새 모음을 구성합니까?) – Rhydgaled

+0

업데이트 해 주셔서 감사합니다. 그래도 사전 이니까'lookUpEdit.Properties.DataSource = items.Values'가 필요했습니다.이벤트 처리기 코드를 저장하기 위해 List로 변경하려고 할 수도 있습니다. – Rhydgaled

0

DevExpress 컨트롤 (지원 포럼에서 질문 할 수 있음)에 대해 모르겠지만 고전적인 Windows 콤보 상자에서는 목록이 컨트롤 안에 유지됩니다. Items 속성은 내부 구조를보다 쉽게 ​​사용할 수있게 해주는 .Net 래퍼입니다. 따라서 각 콤보 박스에 동일한 데이터 구조를 지정할 수 없습니다. 그들은 그들 자신의 사본을 가지고있다.

정적 목록 인 게시/구독 메커니즘을 사용하는 것이 합리적인 해결책 인 것 같습니다.

컨트롤 클래스에 정적 요소가있는 대신 마스터 목록 컨테이너를 별도의 클래스로 만들고 컨트롤에 해당 클래스의 인스턴스를 사용하는 속성을 지정했습니다. 전체 아키텍처를 좀 더 유연하고 테스트 할 수있게 만들 것입니다.

+0

정적 소재를 별도의 클래스로 분할하는 것에 대한 제안에 감사드립니다. 나는 그 부분들을 싱글 톤 클래스로 만들었고 그래서 그것은 내 사용자 컨트롤의 모든 인스턴스에서 사용 가능합니다. – Rhydgaled

관련 문제