BindingList & л; Т & GT; эквивалент словаря в WinForms [дубликат]

Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.

Например:

string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)

if (testString.Length == 0) // Throws a nullreferenceexception
{
    //Do something
} 

Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.

По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит

Дополнительная информация находится в C # NullReferenceException и Null Parameter .

26
задан Peter Mortensen 23 August 2011 в 19:10
поделиться

6 ответов

i, это решит вашу проблему, с которой я столкнулся несколько месяцев назад.

использовать dictionay, так как вы хотите обновить цены на товары, и только когда вы закончите обновление и хотите показать в datagrid, просто сделайте это. надеюсь, вам поможет

Grd.DataSource=null;
Grd.DataSource = Dictionary.Values.ToList();
2
ответ дан adnan umar 24 August 2018 в 01:34
поделиться

Как расширение Bleiers DictionaryBindingList, я сделал небольшое изменение, чтобы позволить добавлять значения для перезаписывания существующих значений. Я использую этот метод с веб-узлом WAMP, поэтому он позволит мне обновлять значения, просто обновляя коллекцию, а затем мне нужно связать события со значениями.

    public void Add(TKey key, TValue value)
    {
        if (Dictionary.ContainsKey(key))
        {
            int position = IndexOf(key);
            Dictionary.Remove(key);
            Remove(key);
            InsertItem(position, new KeyValuePair<TKey, TValue>(key, value));
            return;
        }
        base.Add(new KeyValuePair<TKey, TValue>(key, value));
    }
0
ответ дан David Rath 24 August 2018 в 01:34
поделиться

Возможно, это самый простой способ:

Dictionary<char, double> myList = new Dictionary<char, double>();

        dataGridView1.Columns.Add("Key", "KEY");
        dataGridView1.Columns.Add("Values", "VALUES");

        foreach (KeyValuePair<char,double> item in , myList)
        {
            dataGridView1.Rows.Add(item.Key, item.Value);
        }

Если вы используете это, datagridview будет сортироваться.

5
ответ дан DevQuayle 24 August 2018 в 01:34
поделиться

Или, в LINQ, это приятно и быстро:

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

Это должно быть привязано к столбцам «Item» и «Price».

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

dataGridView1.DataSource = _priceDataArray.ToArray();
52
ответ дан Peter Mortensen 24 August 2018 в 01:34
поделиться

Как расширение предложения Marc, я хотел бы предложить следующее решение, которое также позволит манипулировать словарем во время выполнения:

public class DictionaryBindingList<TKey, TValue> : BindingList<KeyValuePair<TKey, TValue>>
{
    public readonly IDictionary<TKey, TValue> Dictionary;
    public DictionaryBindingList()
    {
        Dictionary = new Dictionary<TKey, TValue>();
    }

    public void Add(TKey key, TValue value)
    {
        base.Add(new KeyValuePair<TKey, TValue>(key, value));
    }

    public void Remove(TKey key)
    {
        var item = this.First(x => x.Key.Equals(key));
        base.Remove(item);
    }

    protected override void InsertItem(int index, KeyValuePair<TKey, TValue> item)
    {
        Dictionary.Add(item.Key, item.Value);
        base.InsertItem(index, item);
    }

    protected override void RemoveItem(int index)
    {
        Dictionary.Remove(this[index].Key);
        base.RemoveItem(index);
    }

    public int IndexOf(TKey key)
    {
        var item = this.FirstOrDefault(x => x.Key.Equals(key));
        return item.Equals(null) ? -1 : base.IndexOf(item);
    }
}
1
ответ дан S. Bleier 24 August 2018 в 01:34
поделиться

Для Dictionary<TKey, TValue> вы можете использовать эти ключевые слова для привязки: Key и Value.

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

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

    ComboBox1.ValueMember = "Key";
    ComboBox1.DisplayMember = "Value";
2
ответ дан Vladislav 24 August 2018 в 01:34
поделиться
Другие вопросы по тегам:

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