কম্বোবক্স- সিলেকশন চেঞ্জড ইভেন্টের নতুন মান নেই, নতুন মান রয়েছে has


91

সি #, .নেট 4.0, ভিএস 2010।

ডব্লিউপিএফ-এ নতুন। আমার মেইন উইন্ডোতে আমার একটি কম্বোবক্স রয়েছে। আমি বললাম কম্বো বাক্সের সিলেকশন চেঞ্জড ইভেন্টটি হুক করেছি। যাইহোক, যদি আমি ইভেন্ট হ্যান্ডলারে কম্বো বাক্সের মানটি পরীক্ষা করি তবে এটির পুরানো মান রয়েছে। এটি একটি বাছাই-পরিবর্তিত ইভেন্টের চেয়ে "সিলেকশন চেঞ্জিং" ইভেন্টের মতো শোনাচ্ছে।

নির্বাচনটি আসলে হেন্ডড্রের পরে কম্বোবক্সের নতুন মানটি কীভাবে পাব?

বর্তমানে:

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

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

দ্রষ্টব্য, আমি যদি ইভেন্ট আরগস, ইজিওরিনালসোর্সটিতে পাস করা অবজেক্টটি ব্যবহার করি তবে আমি একই আচরণ করব।


4
আমি ঠিক একই সমস্যা নিয়ে হোঁচট খেয়েছি - ধন্যবাদ! এটি কি আসলে একটি বাগ, এবং এটির নামটি SelectionChangingপ্রথমে রাখা উচিত ছিল?
জানুয়ারী

উত্তর:


110

এমএসডিএন অনুসারে e.AddedItems,:

নির্বাচন করা আইটেম রয়েছে এমন একটি তালিকা পান।

সুতরাং আপনি ব্যবহার করতে পারেন:

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

আপনি SelectedItemযদি stringএর Itemsথেকে মানগুলি ব্যবহার করেন তবে আপনি এটি ব্যবহার করতে পারেন sender:

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


11
আকর্ষণীয় ... এটির নতুন মান রয়েছে। এবং মুছে ফেলা আইটেমগুলির পুরানো আছে। এই ইভেন্টের নামটি যদি কিছুটা ভুল হয় তবে কমপক্ষে আইএমএইচও হয়। আমি যখন সিলেকশন বদলানো দেখি, তখন আমি প্রত্যাশা করি যে বস্তুর অবস্থা ভালভাবে পরিবর্তিত হয়েছে। আমি দেখতে পারি যদিও এটি আমাদের কিছুটা আরও তথ্য দেয়।
ম্যাট

4
হ্যাঁ, আমি মনে করি কারণ এটি ঘটেছিল, তবে প্রতিশ্রুতিবদ্ধ হয়নি? এটি একটি অনুমান মাত্র। আপনি নির্বাচিত আইটেমটির পাঠ্য পেতে সক্ষম হবেন, আমার সম্পাদনা দেখুন।
SwDevMan81

4
ComboBox.SelectedItemনামে পরিচিত কোনও সম্পত্তি নেই Textতবে আপনি এটি করতে পারেন ComboBox.SelectedItem as string(যদিও এটি কেবলমাত্র যদি আপনি পরীক্ষিতstringItems
musefan

4
কেবল স্ট্রিং টেক্সট = (স্ট্রিং) e. অ্যাডেড আইটেমস [0];
ইগোর সেমিন

4
আশা করি আমি 2 টি আপ দিতে পারতাম, আপনার উত্তর আমাকে 2 টি বিভিন্ন অনুষ্ঠানে দুবার সহায়তা করেছিল
উপুলি হ্যান

59

এখানে যাচাই করার জন্য সঠিক মান হ'ল সিলেক্ট আইটেম সম্পত্তি।

কম্বোবক্স একটি দুটি সমন্বিত নিয়ন্ত্রণ যার দুটি অংশ রয়েছে:

  1. পাঠ্য পার্ট : থেকে এই অংশ অনুরূপ মান টেক্সট কম্বো এর সম্পত্তি।
  2. নির্বাচক পার্ট (অর্থাত "ড্রপ ডাউন" অংশ): এই অংশ অনুরূপ মধ্যে নির্বাচিত আইটেমের SelectedItem সম্পত্তি।

প্রসারিত কম্বোবক্স অংশগুলি

উপরের চিত্রটি কম্বোবক্স প্রসারিত হওয়ার সাথে সাথে নেওয়া হয়েছিল (অর্থাত্ কোনও নতুন মান নির্বাচনের আগে)। এই মুহুর্তে উভয় টেক্সট এবং SelectedItem "তথ্য" হয়, অভিমানী কম্বো আইটেম স্ট্রিং ছিল। যদি কম্বোবক্স আইটেমগুলির পরিবর্তে "লগলভেল" নামক এনামের সমস্ত মান হয় তবে নির্বাচিত আইটেমটি বর্তমানে লগলইভেল.আইনফোর হবে

যখন ড্রপ-ডাউনের কোনও আইটেম ক্লিক করা হয়, তখন সিলেক্ট আইটেমটির মান পরিবর্তন করা হয় এবং সিলেকশন চেঞ্জড ইভেন্টটি উত্থাপিত হয়। পাঠ্য সম্পত্তি, এখনো আপডেট করা হয় না যদিও যেমন টেক্সট পার্ট হওয়া পর্যন্ত আপডেট করা হয় না SelectionChanged হ্যান্ডলার সমাপ্ত হয়। হ্যান্ডলারের একটি ব্রেকপয়েন্ট রেখে কন্ট্রোলটি দেখে এটি লক্ষ্য করা যায়:

নির্বাচন-পরিবর্তিত হ্যান্ডলারের ব্রেকপয়েন্টে কম্বোবক্স ox

যেহেতু এই মুহুর্তে পাঠ্য অংশটি আপডেট করা হয়নি, পাঠ্য সম্পত্তি পূর্বনির্ধারিত মানটি প্রদান করে।


4
সম্পূর্ণ সম্প্রসারণ এবং এটি বুঝতে পেরেছিল যে আমার বাঁধাইটি সঠিক নির্বাচিত আইটেমের পরিবর্তে পাঠ্য সম্পত্তিতে ছিল।
সেমিউসেট

4
@ ডেভিকিড্ডার দুর্দান্ত উদাহরণ! +1
রায়ান উইলসন

47

আপনি যদি কম্বো বাক্সের বর্তমান মান চান তবে নির্বাচনের পরিবর্তে ড্রপডাউন ক্লোজড ইভেন্টটি ব্যবহার করুন han

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

সত্যিই যে সহজ।


10
@ জাভেলিজ আমি মনে করি কোনও কীবোর্ড ব্যবহার করার সময় এটি চালিত হবে না।
NoviceProgrammer

যে স্তন্যপান। নোভিসপ্রগ্রামার কে জানত ...!
লুকানো

10

এটি আমার পক্ষে কাজ করেছে:

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

কোনওভাবে কেবল সিলেক্টড আইটেমটি সিলেক্টভ্যালু নয়, নতুন আইটেমটির সাথে পপুলেশন হয়।
মরিস

7

এটি আমার পক্ষে কাজ করেছে:

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

এই অত্যন্ত গুরুত্বপূর্ণ. গৃহীত উত্তর স্পষ্টভাবে দেখাতে পারে না senderযাতে সঠিক রয়েছে SelectedItem
জেস

4

কম্বোবক্সের পাঠ্যগুলির যে কোনও পরিবর্তনের জন্য নিম্নলিখিত ইভেন্টটি বরখাস্ত করা হয়েছে (যখন নির্বাচিত সূচকটি পরিবর্তিত হয় এবং যখন সম্পাদনা করেও পাঠ্য পরিবর্তন হয়)।

<ComboBox IsEditable="True" TextBoxBase.TextChanged="cbx_TextChanged" />

1
private void OnMyComboBoxChanged(object sender, SelectionChangedEventArgs e)
{
    string newItem = ((DataRowView) e.AddedItems[0]).Row.ItemArray[0].ToString();
}

6
দয়া করে কোড-কেবল উত্তর সরবরাহ করবেন না। আপনার সমাধানটির উত্তর কেন দয়া করে একটি ব্যাখ্যা দিন।
লি টেলর

1

দ্বিতীয় বিকল্পটি আমার পক্ষে কাজ করে নি কারণ। পাঠ্য উপাদানটি সুযোগের বাইরে ছিল (সি # 4.0 ভিএস2008)। এটি আমার সমাধান ছিল ...

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

0

আমার এটি ভিবি.এনইটি-তে সমাধান করা দরকার। আমি যা পেয়েছি তা এখানে কাজ করে বলে মনে হচ্ছে:

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

0

এটি অদ্ভুত যে সিলেক্টড আইটেমটি তাজা ডেটা ধারণ করে, অন্যদিকে সিলেক্টভ্যালু নেই। আমার কাছে বাগের মতো শোনাচ্ছে। যদি কম্বোবক্সে আপনার আইটেমগুলি কম্বোবক্সআইটেমগুলি ব্যতীত অন্য কোনও জিনিস হয় তবে আপনার এই জাতীয় কিছু দরকার হবে: (আমার 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নাল হতে পারে, অন্যদিকে ভিজ্যুয়াল স্টুডিও আমাকে বলে যে একটি KeyValuePairনাল হতে পারে না। এজন্যই আমি SelectedItemএটিকে নালার কাছে ফেলেছি KeyValuePair<string, string>?। তারপরে আমি পরীক্ষা করে দেখি selectedItemযে এর চেয়ে অন্য কোনও মান আছে কি না null। আপনার নির্বাচিত আইটেমটি আসলে যা টাইপ করুন তার ক্ষেত্রে এই পদ্ধতির প্রয়োগ হওয়া উচিত।


0

আপনার যদি সত্যিই SelectionChangedইভেন্টটির প্রয়োজন হয় তবে সর্বোত্তম উত্তর হ'ল SwDevMan81 এর উত্তর। তবে, আপনি যদি ডাব্লুপিএফ দিয়ে শুরু করে থাকেন, তবে আপনি কীভাবে ডাব্লুপিএফ পদ্ধতিতে কাজ করতে হবে তা শিখতে চাইতে পারেন, যা উইন্ডোজ ফর্মের পুরানো দিনগুলির চেয়ে আলাদা SelectionChangedযেগুলি ডাব্লুপিএফ এবং মডেল ভিউ ভিউমোডেল প্যাটার্নের মতো ইভেন্টগুলিতে নির্ভর করে , বাইন্ডিং ব্যবহার করুন। এখানে একটি কোড উদাহরণ:

// 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"); }
    }

}

0
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কেপ্রজেক্টের ব্যবহার হ'ল এমন একটি বর্গ যা ডেটা ধরে রাখে যেহেতু মুছে ফেলা আলাদা করার আগে এটি মুছে ফেলা আইটেম [0] এ ডিফল্ট ছিল। আমার জন্য এই প্রশ্নের উত্তর দেওয়া প্রাথমিক তথ্যের জন্য SwDevMan81 ধন্যবাদ।


0

কোনও কারণ ছাড়াই জিনিসগুলিকে জটিল করবেন না। সিলেক্টভ্যালু সম্পত্তি ব্যবহার করে আপনি সহজেই এর মতো একটি নির্বাচিত কম্বোবক্স মান পেতে পারেন: আপনার কম্বোবক্সনাম.সিলিগ্রেডভ্যালু.টোস্ট্রিং ()।

দৃশ্যের পিছনে সিলেক্টভ্যালিউ সম্পত্তিটি হিসাবে সংজ্ঞায়িত করা হয়েছে: SelectedValue {get; সেট; means এর অর্থ আপনি এটি একটি কম্বোবক্সের মান পেতে বা সেট করতে ব্যবহার করতে পারেন।

সিলেক্টড আইটেম ব্যবহার করা কম্বোবক্স মান পাওয়ার কোনও কার্যকর উপায় নয় কারণ এর জন্য প্রচুর পরিমাণে র্যামফিকেশন প্রয়োজন।


0

আপনি কম্বোবক্স নিয়ন্ত্রণের সিলেকশন চেঞ্জড ইভেন্টে সিলেক্ট ইন্ডেক্স বা সিলেক্টভ্যালু বা সিলেক্ট আইটেম সম্পত্তিটি পরীক্ষা করতে পারেন।


-2

এটি আপনার পক্ষে কাজ করা উচিত ...

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

4
আপনি কীভাবে এই প্রশ্নের উত্তরটি ব্যাখ্যা করতে পারেন?
নাথান টগি

-3

আমি ড্রপডাউন ক্লোজড ইভেন্টটি ব্যবহার করে এটি সমাধান করেছি কারণ মানটি পরিবর্তিত হওয়ার পরে এই অগ্নিকাণ্ড ঘটে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.