DataGridView связал со Словарем

Измените ваш код, как показано ниже:

public void getUserInfo(){
        RecyclerView accountUsers = (RecyclerView) account.findViewById(R.id.AccountList);

        if (accountUsers != null)
        {
        ...
30
задан Peter Mortensen 23 August 2011 в 18:10
поделиться

4 ответа

Есть несколько проблем с Словарь ; во-первых (как вы обнаружили) он не реализует необходимый IList / IListSource . Во-вторых, нет гарантированного порядка элементов (и, действительно, нет индексатора), что делает невозможным произвольный доступ по индексу (а не по ключу).

Однако ... это, вероятно, выполнимо с помощью некоторого дыма и зеркал ; что-то вроде следующего:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

static class Program
{
    [STAThread]
    static void Main()
    {
        Dictionary<string, decimal> prices =
            new Dictionary<string, decimal>();
        prices.Add("foo", 123.45M);
        prices.Add("bar", 678.90M);

        Application.EnableVisualStyles();
        Form form = new Form();
        DataGridView dgv = new DataGridView();
        dgv.Dock = DockStyle.Fill;
        form.Controls.Add(dgv);
        var bl = prices.ToBindingList();
        dgv.DataSource = bl;
        Button btn = new Button();
        btn.Dock = DockStyle.Bottom;
        btn.Click += delegate
        {
            prices.Add(new Random().Next().ToString(), 0.1M);
            bl.Reset();
        };
        form.Controls.Add(btn);
        Application.Run(form);
    }

    public static DictionaryBindingList<TKey, TValue>
        ToBindingList<TKey, TValue>(this IDictionary<TKey, TValue> data)
    {
        return new DictionaryBindingList<TKey, TValue>(data);
    }
    public sealed class Pair<TKey, TValue>
    {
        private readonly TKey key;
        private readonly IDictionary<TKey, TValue> data;
        public Pair(TKey key, IDictionary<TKey, TValue> data)
        {
            this.key = key;
            this.data = data;
        }
        public TKey Key { get { return key; } }
        public TValue Value
        {
            get
            {
                TValue value;
                data.TryGetValue(key, out value);
                return value;
            }
            set { data[key] = value; }
        }
    }
    public class DictionaryBindingList<TKey, TValue>
        : BindingList<Pair<TKey, TValue>>
    {
        private readonly IDictionary<TKey, TValue> data;
        public DictionaryBindingList(IDictionary<TKey, TValue> data)
        {
            this.data = data;
            Reset();
        }
        public void Reset()
        {
            bool oldRaise = RaiseListChangedEvents;
            RaiseListChangedEvents = false;
            try
            {
                Clear();
                foreach (TKey key in data.Keys)
                {
                    Add(new Pair<TKey, TValue>(key, data));
                }
            }
            finally
            {
                RaiseListChangedEvents = oldRaise;
                ResetBindings();
            }
        }

    }
}

Обратите внимание, что использование пользовательского метода расширения является совершенно необязательным и может быть удалено в C # 2.0 и т. д., просто используя вместо этого new DictionaryBindingList (цены) .

23
ответ дан 27 November 2019 в 23:07
поделиться

Или, в LINQ, это удобно и быстро:

var _priceDataArray = from row in _priceData select new { Item = row.Key, Price = row.Value };

Затем это должно быть привязано к столбцам «Товар» и «Цена».

Чтобы использовать его в качестве источника данных в виде сетки вам просто нужно следовать за ним с помощью ToArray () .

dataGridView1.DataSource = _priceDataArray.ToArray();
63
ответ дан 27 November 2019 в 23:07
поделиться

Создайте такой класс:

class MyRow
{
    public string key;
    public double value;
    public string Key {get {return key;}}
    public string Value {get {return value;}}
}

Затем составьте их список:

List<MyRow> rows = new List<MyRow>();

Затем вставьте их в этот список и привяжите данные к списку.

Кстати, если вы есть LINQ, думаю, есть метод ToArray , который все это упростит ...

1
ответ дан 27 November 2019 в 23:07
поделиться

Для Dictionary вы можете использовать следующие ключевые слова для привязки: Key и Value .

Вот пример привязки ComboBox , но можно привязать словарь к DataGridView (установите DataPropertyName для столбца на Key или Значение ).

    ComboBox1.DataSource =
        new BindingSource(Pricelevel.GetPricelevels(), null); // GetPricelevels() returns Dictionary<string, string>

    ComboBox1.ValueMember = "Key";
    ComboBox1.DisplayMember = "Value";
2
ответ дан 27 November 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: