2011-02-24 1 views
1

사용자가 구매 날짜를 입력 할 수있는 드롭 다운 콤보 상자가 포함 된 winform이 있습니다.C# : SelectedIndexChange 이벤트 처리기에서 ComboBox 텍스트 값을 설정 하시겠습니까?

콤보 박스의 항목은 '날짜 선택'으로 캘린더를 표시하므로 사용자는 '오늘'과 '지난 주'를 선택할 수 있습니다. 사용자가 '오늘'또는 '지난 주'를 선택하면 해당 날짜 문자열에 드롭 다운 컨트롤의 텍스트 값을 설정하려고합니다. SelectedIndexChanged 처리기에서이 작업을 수행하려고하는데 주사위가 없습니다. 드롭 다운 목록에는 빈 필드 만 표시됩니다.

아이디어가 있으십니까?

private void comboBoxPurchased_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Types.ComboInfo info = (Types.ComboInfo)comboBoxPurchased.SelectedItem; 

    DateTime newDate = stock.PurchaseDate; 
    switch ((Types.PurchasedDate)info.id) 
    { 
     case Types.PurchasedDate.PickCustom: 
     //popup a date dialog and let the user choose the date 
     PopupCalendar p = new PopupCalendar(); 
     if (p.ShowDialog() == DialogResult.OK) 
      // show date in combobox 
      newDate = p.Date; 
     break; 

     case Types.PurchasedDate.Today: 
     newDate = DateTime.Now; 
     break; 

     case Types.PurchasedDate.WithinLastWeek: 
     newDate = DateTime.Now.AddDays(-7); 
     break; 

     case Types.PurchasedDate.WithinLastMonth: 
     newDate = DateTime.Now.AddMonths(-1); 
     break; 
    } 

    // re-create combobox items with new purchase date 
    //PopulatePurchaseDateCombo(newDate); 
    comboBoxPurchased.SelectedText = date.ToString("MMMM d, yyyy"); 
    comboBoxPurchased.Text = date.ToString("MMMM d, yyyy"); 
} 
+0

selectedindexchanged 이벤트에서 코드를 공유 할 수 있습니까? 내가 올바르게 이해한다면, 콤보 상자의 DropDownStyle 속성을 DropDown으로 변경해야하며 콤보 상자에 표시 할 문자열을 제공해야합니다. – reggie

+0

원래 게시물 – Curtis

+0

코드를 편집하여 편집했습니다. ComboBox.SelectedText 속성 대신 ListItem 자체의 텍스트를 변경해 보았습니까? –

답변

4

콤보 상자의 편집 부에서 선택된 텍스트 속성 SelectedText. MSDN states : 당신이 SelectedIndexChanged 또는 SelectedValueChanged 이벤트 처리기에서 SelectedText 가치를하려고하면

그러나, 속성이 빈 문자열을 반환합니다. 이 이벤트가 발생했을 때 이전 SelectedText 값이 지워지고 새로운 값이 아직 설정되지 않았기 때문입니다. 에 SelectedIndexChanged 또는 SelectedValueChanged 이벤트 처리기에서 현재 값을 검색하려면 SelectedItem 속성을 대신 사용하십시오.

SelectedText 속성 밀접 선택된 인덱스의 변화를 초래할 수있는 선택한 문자를 변화의 SelectedItem 속성에 연결되기 때문이다. 이로 인해 작업 중 하나 또는 두 가지가 성공적으로 완료되는 것을 방지 할 수있는 재진입 문제가 발생할 수 있습니다. 이 경우 트릭은 현재 이벤트가 완료 될 때까지 업데이트를 지연시키는 것입니다. WinForms에서이 작업은 BeginInvoke 메서드와 지연된 작업을 수행 할 적절한 대리자를 사용하여 수행 할 수 있습니다 (WPF 응용 프로그램에서는 현재 컨트롤의 Dispatcher을 사용하여 수행됩니다).

사용 사례가 목록에서 선택하는 아이디어에 실제로 맞지 않으므로이 작업에 대해 콤보 드롭 다운과 다른 컨트롤을 사용하는 것이 좋습니다. 정말로 필요한 것은 메뉴와 텍스트 디스플레이와 같은 것입니다.

+0

감사합니다. BeginInvoke가 트릭을했습니다! – Curtis

+0

@Curtis : 도와 드리겠습니다! –

관련 문제