উইন্ডফর্মের ডেটাগ্রিডভিউতে <T> বাঁধাই তালিকা


91

আমার একটা ক্লাস আছে

class Person{
      public string Name {get; set;}
      public string Surname {get; set;}
}

এবং List<Person>এটিতে আমি কিছু আইটেম যুক্ত করি। তালিকাটি আমার কাছে আবদ্ধ DataGridView

List<Person> persons = new List<Person>();
persons.Add(new Person(){Name="Joe", Surname="Black"});
persons.Add(new Person(){Name="Misha", Surname="Kozlov"});
myGrid.DataSource = persons;

কোন সমস্যা নেই. myGridদুটি সারি প্রদর্শন করে তবে আমি যখন আমার personsতালিকায় নতুন আইটেম যুক্ত করি তখন myGridনতুন আপডেট তালিকাটি প্রদর্শন করে না। এটি কেবলমাত্র দুটি সারি দেখায় যা আমি আগে যুক্ত করেছি।

তাহলে সমস্যাটা কি?

প্রতিবার রিবান্ডিং ভাল কাজ করে। কিন্তু যখন আমি DataTableগ্রিডের সাথে একটি আবদ্ধ করি যখন প্রতিবার যখন আমি কিছু পরিবর্তন করি তখন DataTableরিবাইন্ড করার প্রয়োজন হয় না myGrid

প্রতিবার রিব্যান্ডিং না করে কীভাবে সমাধান করবেন?

উত্তর:


188

তালিকা কার্যকর করে না IBindingListতাই গ্রিডটি আপনার নতুন আইটেমগুলি সম্পর্কে জানতে পারে না।

BindingList<T>পরিবর্তে আপনার ডেটাগ্রিডভিউ বাঁধুন ।

var list = new BindingList<Person>(persons);
myGrid.DataSource = list;

তবে আমি আরও এগিয়ে গিয়ে আপনার গ্রিডকে একটিতে আবদ্ধ করব BindingSource

var list = new List<Person>()
{
    new Person { Name = "Joe", },
    new Person { Name = "Misha", },
};
var bindingList = new BindingList<Person>(list);
var source = new BindingSource(bindingList, null);
grid.DataSource = source;


4
@ পেচান: অবশ্যই আপনি পারবেন তবে ডেটাগ্রিডভিউকে আপনার ডাটাসোর্সের কোনও পরিবর্তন আছে কিনা তা জানতে হবে। Oneউপায়টি একটি বন্ডিংলিস্ট ব্যবহার করার উপায় নয়, যা অন্তর্নিহিত তালিকার পরিবর্তিত হলে কোনও ইভেন্ট উত্থাপন করবে। আরেকটি উপায় হ'ল প্রতিটি সময় আপনি BindingSourceকোনও সারি যুক্ত / মুছুন তবে রিসেটবাইন্ডিং () ব্যবহার করুন এবং আরও কাজ চালিয়ে যান। সম্পত্তি পরিবর্তন সম্পর্কে গ্রিডকে অবহিত করতে চাইলে বাস্তবায়ন করা সহজতম উপায়INotifyPropertyChanged
জর্জেন স্টেইনব্লক

4
আপনি কেন বাইন্ডিংলিস্ট এবং বাইন্ডিংসোর্স ব্যবহার করেছেন কারণ আমরা সরাসরি ডেটাগ্রিডভিউ ডেটাসোর্স সম্পত্তিটিতে তালিকাটি বন্ড করতে পারি। আপনি এখানে ব্যবহৃত বাইন্ডলিস্ট এবং বাইন্ডিংসোর্সের গুরুত্ব সম্পর্কে আলোচনা করুন। ধন্যবাদ
মৌ

4
@ মৌ আপনি চাইলে একটি ডেটাগ্রিড বাঁধতে List<T>পারেন। তবে আপনি যদি ক্রমগতভাবে তালিকার ডেটাগ্রিডভিউতে আইটেমগুলি যুক্ত করেন তবে এটি সম্পর্কে আপনি জানতে পারবেন না কারণ আপনি তালিকা ইমপ্লিট করেন না IBindingList। বাইন্ডিংসোর্স সম্পর্কিত: আমি উইনফর্মগুলি প্রচুর ব্যবহার করি এবং আমি একটি বাইন্ডসোর্স - ফুলস্টপ ব্যতীত অন্য কোনও কিছুকে আবদ্ধ করি না। আরও বিশদ যুক্ত করা একটি মন্তব্যের জন্য খুব বেশি, তবে BindingSourceকোনও অসুবিধা ছাড়াই অফার করার মতো অনেক কিছুই রয়েছে। আমি এতদূর গিয়ে বলবAnyone who does not use a BindingSource for binding has not fully understood windows forms databindings
জারজেন স্টেইনব্লক

4
@ ক্রেইগব্রেট আপনার ডেটাসোর্স BindingSourceএবং আপনার জিইউআইয়ের মধ্যে একটি সেতু হিসাবে বিবেচনা করুন । এটি অনেকগুলি ডেটাবাইন্ডিং সম্পর্কিত সমস্যা সমাধান করে। আপনি কি আপনার ডেটা পুনরায় লোড করতে চান? bindingSource.DataSourceপ্রতিটি নিয়ন্ত্রণ পুনরায় ফিরিয়ে দেওয়ার পরিবর্তে আপনার নতুন সংগ্রহকে সেট করুন । আপনার ডাটাসোর্স নাল হতে পারে? সেট bindingSource.DataSource = typeof(YourClass)আপনি একটি সম্পাদনাযোগ্য গ্রিড রাখতে চান তবে আপনার ডেটাসোর্সে প্যারামিটারলেস কনস্ট্রাক্টর নেই? কেবল bindingSource.AddingNewইভেন্টটি বাস্তবায়ন করুন এবং অবজেক্টটি নিজে তৈরি করুন। ব্যবহার করার সময় আমি কখনও কোনও খারাপ দিক অনুভব করি নি BindingSourceতবে প্রচুর বেনিফিট।
জর্জেন স্টেইনব্লক

4

প্রতিবার আপনি তালিকায় একটি নতুন উপাদান যুক্ত করুন আপনার গ্রিডটি পুনরায় বাঁধতে হবে। কিছুটা এইরকম:

List<Person> persons = new List<Person>();
persons.Add(new Person() { Name = "Joe", Surname = "Black" });
persons.Add(new Person() { Name = "Misha", Surname = "Kozlov" });
dataGridView1.DataSource = persons;

// added a new item
persons.Add(new Person() { Name = "John", Surname = "Doe" });
// bind to the updated source
dataGridView1.DataSource = persons;

আমি ডেটাগ্রিডের অধীনে ডেটাসোর্স সম্পত্তি দেখতে পাচ্ছি না you আপনি কীভাবে আমি এটি ব্যবহার করব তা বলতে পারেন?
আরএসবি

2

হ্যাঁ, INotifyPropertyChanged ইন্টারফেস প্রয়োগ করে রিবান্ডিংয়ের সাথে কাজ করা সম্ভব।

খুব সহজ উদাহরণ এখানে পাওয়া যায়,

http


4
এটি পর্যাপ্ত নয়, আপনি যদি INotifyPropertyChangedডেটাগ্রিডভিউ প্রয়োগ করেন তবে পটভূমিতে ঘটে যাওয়া সমস্ত সম্পত্তি পরিবর্তনগুলি দেখাবে, তবে আপনি যদি আপনার উত্স থেকে কোনও সারি যুক্ত / মুছবেন কিনা তা তা জানতে পারবে না। এই উদ্দেশ্যে একটি IBindingListইন্টারফেস রয়েছে এবং আপনার দৃ conv় বিশ্বাসের জন্য, একটি প্ররোচনা BindingList<T>যা ইতিমধ্যে এটি প্রয়োগ করে, তবে বাছাই / ফিল্টারিং সমর্থন করে না।
জর্জেন স্টেইনব্লক

4
হ্যাঁ, আমি আপনার সাথে একমত হবে। সুতরাং আমি মনে করি পর্যবেক্ষণযোগ্য সংগ্রহ <টি> এর জন্য ব্যবহার করা যেতে পারে। আপনি কি মনে করেন?
দেব

0

যুক্ত করার জন্য নতুন আইটেম যুক্ত করার পরে persons:

myGrid.DataSource = null;
myGrid.DataSource = persons;

আমি ডেটাগ্রিডের অধীনে ডেটাসোর্স সম্পত্তি দেখতে পাচ্ছি না you আপনি কীভাবে আমি এটি ব্যবহার করব তা বলতে পারেন?
আরএসবি

4
এই পরামর্শটি সমস্যার কারণ হতে পারে। উদাহরণস্বরূপ, আপনি দেখতে পেলেন যে গ্রিডের কোনও আইটেমের ক্লিকের ফলে সূচকটি সেই সময়ে ডালাসোর্সটি শূন্য হওয়ায় একটি সূচকপ্রাপ্তি পেতে পারে । প্রাথমিকভাবে কোনও বন্ডিংলিস্টে আবদ্ধ হওয়া এবং আপনার উত্তরগুলিতে INotifyPropertyChanged প্রয়োগ করা আরও বুদ্ধিমানের কাজ হবে যেমন অন্যান্য উত্তরগুলি নির্দেশ করে
স্টিভ

আপনি nullযদি তা personsপরের লাইনে তাৎক্ষণিকভাবে অর্পণ করেন তবে এটিকে বরাদ্দ দেওয়ার বিন্দু কী ?
রুফাস এল

0

এটি আমার কাছে ঠিক তেমন সমস্যা ছিল না, তবে যদি কেউ যে কোনও ধরণের একটি বন্ডিংলিস্টকে একই ধরণের তালিকায় রূপান্তর করতে দেখছে, তবে এটি এইভাবে হয়:

var list = bindingList.ToDynamicList();

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

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