Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это 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 .
i, это решит вашу проблему, с которой я столкнулся несколько месяцев назад.
использовать dictionay, так как вы хотите обновить цены на товары, и только когда вы закончите обновление и хотите показать в datagrid, просто сделайте это. надеюсь, вам поможет
Grd.DataSource=null;
Grd.DataSource = Dictionary.Values.ToList();
Как расширение 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));
}
Возможно, это самый простой способ:
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 будет сортироваться.
Или, в LINQ, это приятно и быстро:
var _priceDataArray = from row in _priceData select new { Item = row.Key, Price = row.Value };
Это должно быть привязано к столбцам «Item» и «Price».
Чтобы использовать его как источник данных в виде сетки, вам просто нужно следовать ему с помощью ToArray()
.
dataGridView1.DataSource = _priceDataArray.ToArray();
Как расширение предложения 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);
}
}
Для 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";