কিভাবে একটি তালিকা <স্ট্রিং> একটি ডেটাগ্রিডভিউ নিয়ন্ত্রণে বাঁধবেন?


85

আমার একটি সাধারণ আছে List<string>এবং আমি এটি একটি DataGridViewকলামে প্রদর্শিত হতে চাই ।
যদি তালিকায় আরও জটিল অবজেক্ট থাকে তবে কেবল তার DataSourceসম্পত্তির মান হিসাবে তালিকাটি স্থাপন করে ।

তবে এটি করার সময়:

myDataGridView.DataSource = myStringList;

আমি একটি কলাম পেয়েছি Lengthএবং স্ট্রিংগুলির দৈর্ঘ্য প্রদর্শিত হবে।

কলামে তালিকা থেকে প্রকৃত স্ট্রিংয়ের মানগুলি কীভাবে প্রদর্শিত করবেন?

উত্তর:


70

Thats কারণ ডেটাগ্রিডভিউ উপাদানযুক্ত উপাদানগুলির বৈশিষ্ট্য সন্ধান করে। স্ট্রিংয়ের জন্য কেবল একটি সম্পত্তি - দৈর্ঘ্য। সুতরাং, আপনার এই জাতীয় একটি স্ট্রিংয়ের জন্য একটি মোড়কের দরকার

public class StringValue
{
    public StringValue(string s)
    {
        _value = s;
    }
    public string Value { get { return _value; } set { _value = value; } }
    string _value;
}

তারপরে List<StringValue>আপনার গ্রিডে অবজেক্টটি আবদ্ধ করুন । এটা কাজ করে


4
DataPropertyNameকলামের হতে হবেValue
Rémi

গ্রুপিং সম্পর্কে কী? এখন "A" "A" এর সমান নয় এবং আমার দুটি গ্রুপ "A" রয়েছে।
রোভার

98

এটা চেষ্টা কর:

IList<String> list_string= new List<String>();
DataGridView.DataSource = list_string.Select(x => new { Value = x }).ToList();
dgvSelectedNode.Show();

আশা করি এটা কাজে লাগবে.


13
আপনি যদি আইলিস্টের পরিবর্তে কোনও তালিকা ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন List.ConvertAll(x => new { Value = x});
স্কটি ডটনেট

7
এটি কাজ করে তবে তালিকা_ স্ট্রিংয়ের পরিবর্তনগুলি ডেটাগ্রিডভিউ আপডেট করবে না।
পেড্রো 77

গ্রিড আপডেট করতে আবার লিনাক স্টেটমেন্ট চালানো দরকার।
জেফ

4
ডিজিভিসিলেক্টড নোড.শো () কী?
ডুয়ান ওয়াকার

18

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

<sdk:DataGridTextColumn Binding="{Binding}" />

আমি এই উত্সাহ পরীক্ষা করেছি এবং এটি সঠিকভাবে কাজ করেছে। এটি অন্যের সমাধানগুলির চেয়ে পরিষ্কার।
গুস্তাভো কার্ডোসো

7
এটি সিলভারলাইটের সাথে নির্দিষ্ট নয়?
নোভিসপ্রগ্রামার

4
এটি ডাব্লুপিএফ-তেও কাজ করে .. আপনি কেন একটি ভুল মন্তব্যকে সমর্থন করবেন?
বপপিটি বুপ

4
ডাউনভোটিং কারণ মূল প্রশ্নে "ডেটাগ্রিডভিউ" ট্যাগ রয়েছে, যা উইনফর্মস নিয়ন্ত্রণ। এই সমাধানটি উইনফ্রোমের ক্ষেত্রে প্রযোজ্য নয়।
ভিআইএস

13

আপনি এখানে বর্ণিত হিসাবে অনেক কম কোড সহ একই ফলাফল অর্জন করতে লিনাক এবং বেনামে ধরণের ব্যবহার করতে পারেন ।

আপডেট: ব্লগ নিচে রয়েছে, এখানে লিখিত সামগ্রীটি রয়েছে:

(..) সারণীতে প্রদর্শিত মানগুলি স্ট্রিংয়ের মানগুলির পরিবর্তে স্ট্রিংয়ের দৈর্ঘ্যের প্রতিনিধিত্ব করে (!) এটি আশ্চর্যজনক মনে হতে পারে তবে এটি কীভাবে বাধ্যতামূলক প্রক্রিয়াটি ডিফল্টরূপে কাজ করে - কোনও বস্তু দেওয়া হলে এটি তার প্রথম সম্পত্তিটিকে আবদ্ধ করার চেষ্টা করবে অবজেক্ট (এটি প্রথম সন্ধান করতে পারে সম্পত্তি) যখন উদাহরণটি স্ট্রিং ক্লাসটি পাস করা হয় তখন তার সাথে সংযুক্ত সম্পত্তিটি স্ট্রিং থাকে en দৈর্ঘ্য যেহেতু অন্য কোনও সম্পত্তি নেই যা আসল স্ট্রিং নিজেই সরবরাহ করে।

এর অর্থ হ'ল আমাদের বাধ্যতামূলক অধিকার পেতে আমাদের এমন একটি মোড়কের বস্তুর প্রয়োজন যা একটি স্ট্রিংয়ের প্রকৃত মান সম্পত্তি হিসাবে প্রকাশ করবে:

public class StringWrapper
    {
     string stringValue;
     public string StringValue { get { return stringValue; } set { stringValue = value; } }

     public StringWrapper(string s)
     {
     StringValue = s;
     }
  }   

   List<StringWrapper> testData = new List<StringWrapper>();

   // add data to the list / convert list of strings to list of string wrappers

  Table1.SetDataBinding(testdata);

এই সমাধানটি আশানুরূপভাবে কাজ করার সময় বেশ কয়েকটি লাইনের কোডের প্রয়োজন হয় (বেশিরভাগ ক্ষেত্রে স্ট্রিংয়ের তালিকাটিকে স্ট্রিং মোড়কের তালিকায় রূপান্তর করতে)।

আমরা লিনকিউ এবং বেনামে প্রকারের সাহায্যে এই সমাধানটি উন্নত করতে পারি- আমরা স্ট্রিং র‌্যাপারগুলির একটি নতুন তালিকা তৈরি করতে লিনকিউ কোয়েরি ব্যবহার করব (স্ট্রিং র্যাপার আমাদের ক্ষেত্রে একটি বেনামি প্রকার হবে)।

 var values = from data in testData select new { Value = data };

 Table1.SetDataBinding(values.ToList());

আমরা সর্বশেষ পরিবর্তনটি করতে যাচ্ছি লাইনকো কোডটি একটি এক্সটেনশন পদ্ধতিতে স্থানান্তর করা:

public static class StringExtensions
  {
     public static IEnumerable CreateStringWrapperForBinding(this IEnumerable<string> strings)
     {
     var values = from data in strings
     select new { Value = data };

     return values.ToList();
     }

এইভাবে আমরা স্ট্রিংয়ের যে কোনও সংগ্রহের ক্ষেত্রে একক পদ্ধতিতে কল করে কোডটি পুনরায় ব্যবহার করতে পারি:

Table1.SetDataBinding(testData.CreateStringWrapperForBinding());

8

এটি সাধারণ সমস্যা, অন্য উপায় হ'ল ডেটা টেবল অবজেক্টটি ব্যবহার করা

DataTable dt = new DataTable();
dt.Columns.Add("column name");

dt.Rows.Add(new object[] { "Item 1" });
dt.Rows.Add(new object[] { "Item 2" });
dt.Rows.Add(new object[] { "Item 3" });

এই সমস্যাটি এখানে বিশদে বর্ণনা করা হয়েছে: http://www.psworld.pl/Pramramming/BindListOfString


4
তবে ডেটেটেবলটি <t> তালিকাটি ভারী, এবং বেশিরভাগ বিকাশকারী ডেটাটেবলের ব্যবহার এড়াতে পারবেন।
Musikero31

2

লিনকিউ-এর মাধ্যমে সত্যিকারের বৃহত তালিকা নির্ধারণের সময় আপনি পারফরম্যান্স সম্পর্কিত সমস্যার সমাধান করতে পারেন। নিম্নলিখিত সমাধানটি বৃহত তালিকার জন্য এবং স্ট্রাক্লাসিং স্ট্রিং ছাড়াই উপযুক্ত:

ভার্চুয়াল মোডে ডেটাগ্রিডভিউ (এখানে "দেখুন") সেট করুন, আপনার প্রয়োজনীয় কলাম তৈরি করুন এবং সেলভ্যালিউনিডের ইভেন্টের জন্য ওভাররাইড / নিবন্ধ করুন

private void View_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
    // Optionally: check for column index if you got more columns
    e.Value = View.Rows[e.RowIndex].DataBoundItem.ToString();
}

তারপরে আপনি কেবল ডাটাগ্রিডভিউতে আপনার তালিকা নির্ধারণ করতে পারেন:

List<String> MyList = ...
View.DataSource = MyList;

2

এটা চেষ্টা কর :

//i have a 
List<string> g_list = new List<string>();

//i put manually the values... (for this example)
g_list.Add("aaa");
g_list.Add("bbb");
g_list.Add("ccc");

//for each string add a row in dataGridView and put the l_str value...
foreach (string l_str in g_list)
{
    dataGridView1.Rows.Add(l_str);
}

4
আপনি বুঝতে পারছেন যে এই প্রশ্নটি 6 বছরের পুরানো এবং সঠিক উত্তর দেওয়া হয়েছে?
হোজিকিমারু

4
আপনাকে প্রথমে ডাটাগ্রিড ভিউতে কলাম যুক্ত করতে হবে বা এটি কাজ করবে না
ডেল্টানাইন

0

বিকল্পটি হ'ল একটি নতুন সহায়ক ফাংশন ব্যবহার করা যা ডাটাগ্রিডভিউতে তালিকা থেকে আপডেট এবং আপডেট হিসাবে নিবে:

    private void DisplayStringListInDataGrid(List<string> passedList, ref DataGridView gridToUpdate, string newColumnHeader)
    {
        DataTable gridData = new DataTable();
        gridData.Columns.Add(newColumnHeader);

        foreach (string listItem in passedList)
        {
            gridData.Rows.Add(listItem);
        }

        BindingSource gridDataBinder = new BindingSource();
        gridDataBinder.DataSource = gridData;
        dgDataBeingProcessed.DataSource = gridDataBinder;
    }

তারপরে আমরা এই ফাংশনটিকে নিম্নলিখিত পদ্ধতিতে কল করতে পারি:

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