2010-04-27 2 views
0

Im는 C# .net windows form application을 사용합니다. 테이블이있는 데이터베이스가 있습니다. 두 개의 콤보 상자가 있습니다 (A & B). sys.columns를 사용하여 테이블의 열 이름으로 콤보 상자 A를 채 웠습니다. 이제 콤보 상자 A에서 항목을 선택하면 콤보 박스 A에서 선택한 선택한 항목을 제외하고 콤보 상자 B에 동일한 항목이 채워 져야합니다.하나의 콤보 박스의 항목이 다른 주소로 들어가면 안됩니다.

+0

그리고 질문은 ....입니까? –

+0

중복 질문 : http://stackoverflow.com/questions/2720648/working-with-two-combo-boxes/2720728#2720728 –

답변

1

이 질문이나 this one과 동일한 항목을 삭제해야합니다. 어쨌든, 여기 내 대답은 다음과 같습니다.

A의 선택한 항목 변경 이벤트에서 B를 지우고 A 항목 컬렉션의 각 항목을 반복하고 현재 항목의 색인 인 동안 B에 추가합니다 A.에서의 selectedItem의 인덱스와 다른

B.Items.Clear; 
foreach(object o in A.Items) 
{ 
    b.Items.Add(o); 
} 
b.Items.Remove(A.SelectedItem); 

이 그것을 어떻게해야

b.Items.Clear; 
for(int i=0; i<A.Items.Count; i++) 
{ 
    if (i!=A.SelectedItemIndex) 
    { 
    b.Items.Add(A.Items[i]); 
    } 
} 

또는

(테스트하지 의사 코드)와 같은 뭔가 좋은데.

0

나는 당신이

0
m_comboB.Items.AddRange((from item in m_comboA.Items.Cast<object>() 
         where item != m_comboA.SelectedItem 
         select item).ToArray()); 

의 변경 이벤트에 B의 충전/제거를 코딩해야합니다 아니면 중복 항목을 제거하지 않는이 방법을 사용할 수있을 것 같아요 (샘이 지적 그의 덧글) :

m_comboB.Items.AddRange(Enumerable.Range(0, m_comboA.Items.Count) 
    .Where(index => index != m_comboA.SelectedIndex) 
    .Select(index => m_comboA.Items[index]).ToArray()); 
+0

콤보 A에 중복 항목이있는 경우이 항목이 두 개 이상 제거됩니다. .... –

+0

예, 물론, 설명은 그것에 대해 아무 말도하지 않았습니다. – Patrik

1

나는 정적 확장 방법과 LINQ의 조합을 사용합니다.

정적 확장 부분은 다음과 같을 것이다 :

// static class... 
public static class ComboBoxHelper 
{ 
    public static string GetSelectedIndexText(this ComboBox target) 
    { 
     return target.Items[target.SelectedIndex].ToString(); 
    } 

    public static object[] GetNonSelectedItems(this ComboBox target) 
    { 
     string selected = GetSelectedIndexText(target); 

     try 
     { 
      object[] result = 
       target.Items.Cast<object>().Where(c => c.ToString() 
       != selected).ToArray(); 
      return result; 
     } 
     catch 
     { 
      return new object[] { }; 
     } 
    } 

    public static void ReplaceItems(this ComboBox target, object[] newRange) 
    { 
     target.Items.Clear(); 
     target.Items.AddRange(newRange); 
    } 
} 

그리고 LINQ를 :

// LINQ: 
private void ComboBoxA_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    comboBoxB.ReplaceItems(comboBoxA.GetNonSelectedItems()); 
} 

HTH를!

참고 : 목록 항목 배열을 반환하는 것보다 효율적인 방법이 있지만 큰 그림 (예 : 전체 성능 등)에서 큰 문제가되지는 않습니다 .....

+0

이름이 같은 두 개의 항목이있는 경우 솔루션을 사용하여 두 항목이 모두 제거됩니다. – Patrik

관련 문제