programing

ComboBox - SelectionChanged 이벤트에 새 값이 아닌 이전 값이 있습니다.

padding 2023. 6. 12. 21:12
반응형

ComboBox - SelectionChanged 이벤트에 새 값이 아닌 이전 값이 있습니다.

C#, .NET 4.0, VS2010.

WPF가 처음입니다.기본 창에 콤보 상자가 있습니다.나는 해당 콤보 박스의 SelectionChanged 이벤트를 건넸습니다.그러나 이벤트 핸들러에서 콤보 상자의 값을 조사해 보면 이전 값이 있습니다.이는 SelectionChanged 이벤트라기보다는 "SelectionChanged" 이벤트처럼 들립니다.

실제로 선택한 후 ComboBox의 새 값을 얻으려면 어떻게 해야 합니까?

현재:

this.MyComboBox.SelectionChanged += new SelectionChangedEventHandler(OnMyComboBoxChanged);

...
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = this.MyComboBox.Text;
}

예를 들어 이벤트 인수에서 전달되는 객체를 사용하면 동일한 동작이 발생합니다.원본 원본.

MSDN에 따르면:

선택한 항목이 포함된 목록을 가져옵니다.

그래서 당신은 다음을 사용할 수 있습니다.

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (e.AddedItems[0] as ComboBoxItem).Content as string;
}

은 또한 수있다습니도를 사용할 .SelectedItemstring에 값Itemssender:

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = (sender as ComboBox).SelectedItem as string;
}

또는

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;
}

다 둘니까.Content그리고.SelectedItem입니다. 더 은 객체를 사용하는 입니다..ToString()as string

여기서 확인해야 할 올바른 값은 Selected입니다.항목 속성.

ComboBox는 다음과 같은 두 부분으로 구성된 복합 컨트롤입니다.

  1. 텍스트 파트: 이 파트의 값은 콤보 상자의 텍스트 속성에 해당합니다.
  2. 선택기 부품(즉, "드롭다운" 부품):이 부품에서 선택한 항목은 선택한 항목에 해당합니다.항목 속성.

확장 콤보 상자 부품

위의 이미지는 ComboBox가 확장된 직후(즉, 새 값을 선택하기 전)에 촬영되었습니다.이 시점에서 텍스트와 선택됨ComboBox 항목이 문자열이라고 가정할 때 항목은 "Info"입니다.ComboBox 항목이 대신 "LogLevel"이라는 Enum의 모든 값인 경우 선택됨항목현재 LogLevel입니다.정보.

드롭다운의 항목을 클릭하면 선택한 값이항목이 변경되고 SelectionChanged 이벤트가 발생합니다.그러나 텍스트 속성은 SelectionChanged 핸들러가 완료될 때까지 업데이트되지 않기 때문에 아직 업데이트되지 않습니다.이 문제는 핸들러에 중단점을 두고 컨트롤을 보면 알 수 있습니다.

SelectionChanged 핸들러의 중단점에 있는 ComboBox

이 시점에서 텍스트 파트가 업데이트되지 않았으므로 텍스트 속성은 이전에 선택한 값을 반환합니다.

콤보 상자의 현재 값을 원하는 경우 변경됨 선택 대신 DropDownClosed 이벤트를 사용합니다.

private void comboBox_DropDownClosed(object sender, EventArgs e)
{
   MessageBox.Show(comboBox.Text) 
}

정말 그렇게 간단하죠.

이것은 저에게 효과가 있었습니다.

private void AppName_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   ComboBoxItem cbi = (ComboBoxItem)AppName.SelectedItem;
   string selectedText = cbi.Content.ToString();
}

이것은 저에게 효과가 있었습니다.

private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    var text = ((sender as ComboBox).SelectedItem as ComboBoxItem).Content as string;            
}

콤보 상자의 텍스트 변경에 대해 다음 이벤트가 발생합니다(선택한 인덱스가 변경된 경우 및 편집을 통해 텍스트도 변경된 경우).

<ComboBox IsEditable="True" TextBoxBase.TextChanged="cbx_TextChanged" />
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string newItem = ((DataRowView) e.AddedItems[0]).Row.ItemArray[0].ToString();
}

두 번째 옵션은 저에게 효과가 없었습니다. 왜냐하면.텍스트 요소가 범위를 벗어났습니다(C# 4.0 VS 2008).이게 내 해결책이었어요

string test = null;
foreach (ComboBoxItem item in e.AddedItems)
{
   test = item.Content.ToString();
   break;
}

만약 당신이 정말로 필요하다면.SelectionChanged이벤트, 그러면 가장 좋은 대답은 SwDevMan81의 대답입니다. 방식으로 수. 와 같은 Forms 시절과는 .SelectionChangedWPF 및 모델 뷰 모델 패턴의 경우 바인딩을 사용해야 합니다.다음은 코드 예제입니다.

// In the Views folder: /Views/MyWindow.xaml:
// ...
<ComboBox ItemsSource="{Binding MyViewModel.MyProperties, RelativeSource={RelativeSource AncestorType=Window}}"
         SelectedItem="{Binding MyViewModel.MyProperty  , RelativeSource={RelativeSource AncestorType=Window}}" />
// ...



// In the Views folder: /Views/MyWindow.xaml.cs:
public partial class MyWindow : Window
{
    public  MyViewModelClass MyViewModel {
        get { return _viewModel; }
        private set { _viewModel = value;}
    }

    public MyWindow()
    {
        MyViewModel.PropertyChanged += MyViewModel_PropertyChanged;

    }

    void MyViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "MyProperty")
        {
            // Do Work
            // Put your logic here!
        }
    }
}

using System.ComponentModel;

// In your ViewModel folder: /ViewModels/MyViewModelClass.cs:
public class MyViewModelClass : INotifyPropertyChanged
{
    // INotifyPropertyChanged implementation:
    private void NotifyPropertyChanged(string propertyName = "") { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } }
    public event PropertyChangedEventHandler PropertyChanged;

    // Selected option:
    private string _myProperty;
    public  string  MyProperty {
        get { return _myProperty; }
        set { _myProperty = value; NotifyPropertyChanged("MyProperty"); }
    }

    // Available options:
    private List<string> _myProperties;
    public  List<string>  MyProperties {
        get { return _myProperties; }
        set { _myProperties = value; NotifyPropertyChanged("MyProperties"); }
    }

}
private void indBoxProject_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    int NewProjID = (e.AddedItems[0] as kProject).ProjectID;
    this.MyProject = new kProject(NewProjID);
    LoadWorkPhase();
}

.e.AddedItems[0] as kProject여기서 kProject는 이러한 명확한 구분을 하기 전에 RemovedItems[0]로 기본 설정되어 있던 데이터를 저장하는 클래스입니다.이 질문에 답변해주신 초기 정보에 대해 SwDevMan81님께 감사드립니다.

VB.NET에서 해결해야 했습니다.효과가 있는 것처럼 보이는 것은 다음과 같습니다.

Private Sub ComboBox1_SelectionChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.SelectionChangedEventArgs) Handles ComboBox_AllSites.SelectionChanged
   Dim cr As System.Windows.Controls.ComboBoxItem = ComboBox1.SelectedValue
   Dim currentText = cr.Content
   MessageBox.Show(currentText)
End Sub

항목에는 새 데이터가 저장되지만 선택한 값에는 저장되지 않습니다.저한테는 벌레처럼 들리네요.이 ComboBoxItems가 다른 ( ComboBox 항목가 ComboBoxItems 아닌내다른개체인다다과음니필합것요이이름같은우경의이내▁(▁if▁combo▁this▁something이▁other)▁like)ComboBox를 포함합니다.KeyValuePair

var selectedItem = (KeyValuePair<string, string>?)(sender as ComboBox).SelectedItem;
if (!selectedItem.HasValue)
    return;

string selectedValue = selectedItem.Value.Value;  // first .Value gets ref to KVPair

ComboBox.SelectedItem는 'Visual Studio'가 'Visual Studio'의 'Null'이라고 반면 'Visual Studio'는 'Null'입니다.KeyValuePair수 . "라는 메시지가 표시됩니다.그래서 제가 캐스팅한 거든요.SelectedItem가 될 때까지KeyValuePair<string, string>?그리고 나서 확인합니다.selectedItem다음 값 이외의 값이 있습니다.null이 접근 방식은 선택한 항목이 실제로 어떤 유형이든 적용할 수 있어야 합니다.

이유 없이 일을 복잡하게 만들지 마세요.SelectedValue 속성을 사용하면 다음과 같이 선택한 ComboBox 값을 쉽게 얻을 수 있습니다.ComboBoxName입니다.선택한 값.ToString().

씬(scene) 뒤에서 SelectedValue 속성은 다음과 같이 정의됩니다. SelectedValue{get;set;}. 즉, 이 속성을 사용하여 ComboBox의 값을 가져오거나 설정할 수 있습니다.

선택한 항목 사용항목은 많은 영향을 필요로 하기 때문에 ComboBox 값을 얻는 효율적인 방법이 아닙니다.

선택됨을 선택할 수 있습니다.인덱스 또는 선택한 값 또는 선택한 값Combobox 컨트롤의 SelectionChanged 이벤트에 있는 Item 속성입니다.

콤보 상자의 SelectionChanged 이벤트에서 다음과 같이 선택한 항목 텍스트를 얻을 수 있습니다.

        private void myComboBox_SelectionChanged (object sender, SelectionChangedEventArgs e)
        {
        ComboBoxItem comboBoxItem = (ComboBoxItem) e.AddedItems[0];
        string selectedItemText = comboBoxItem.Content.ToString();
        }

깔끔하고 간편한 - 텍스트 변경

private void ComboBox1_TextChanged(object sender, EventArgs e)
    {
        MessageBox.Show(ComboBox1.Text);
    }

다음은 현재 선택된 ComboBox(c# / .net6)를 가져오는 데 도움이 됩니다.

private void comboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    string? text = ((ComboBoxItem)(sender as ComboBox).SelectedItem).Content as string;
    
    if(text != null){
        ...
    }
}

이 방법은 당신에게 도움이 될 것입니다...

int myInt= ((data)(((object[])(e.AddedItems))[0])).kid;

DropDownClosed 이벤트를 사용하여 이 문제를 해결했습니다. 이 이벤트는 값이 변경된 후에 약간 발생하기 때문입니다.

언급URL : https://stackoverflow.com/questions/2961118/combobox-selectionchanged-event-has-old-value-not-new-value

반응형