Измените ваш код, как показано ниже:
public void getUserInfo(){
RecyclerView accountUsers = (RecyclerView) account.findViewById(R.id.AccountList);
if (accountUsers != null)
{
...
Есть несколько проблем с Словарь
; во-первых (как вы обнаружили) он не реализует необходимый 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
.
Или, в LINQ, это удобно и быстро:
var _priceDataArray = from row in _priceData select new { Item = row.Key, Price = row.Value };
Затем это должно быть привязано к столбцам «Товар» и «Цена».
Чтобы использовать его в качестве источника данных в виде сетки вам просто нужно следовать за ним с помощью ToArray ()
.
dataGridView1.DataSource = _priceDataArray.ToArray();
Создайте такой класс:
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
, который все это упростит ...
Для 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";