C # Winforms словарь привязки DataGrid Автоматическое обновление без потери фокуса - PullRequest
1 голос
/ 15 июля 2010

Настройка

  • Приложение C # WinForms.

Резюме

  • Привязка словаря к представлению данных.
  • При обновлении словаря автоматически обновляется сетка данных.
  • Сетка данных не теряет фокус при обновлении.
  • Привязка работает в обе стороны (редактирование значений в сетке обновляет словарь.

Сценарий

  • У меня есть класс, который вычисляет значения на основании данных из базы данных.
  • Данные в этой базе данных постоянно меняются, следовательно, изменяются и рассчитанные значения.
  • Эти вычисленные значения добавляются в свойства пользовательского объекта "MyCustomObject".
  • Каждый «MyCustomObject» затем добавляется в словарь (или пользовательский объект обновляется, если он уже существует).
  • Словарь привязан к сетке данных.

Идея

  • Идея состоит в том, что вычисленные значения постоянно меняются и, таким образом, обновляется словарь, который, в свою очередь, обновляет сетку данных.
  • Пользователи, которые взаимодействуют с сетью данных, должны иметь возможность автоматически видеть эти изменения.
  • Обязательно, чтобы текущая выбранная строка в сетке данных не теряла фокус, когда сетка обновляется новыми значениями пользовательских объектов.
  • Привязка должна работать в обоих направлениях (редактирование значений в сетке также обновляет словарь.

Вопрос

  • Как я могу реализовать это автоматическое связывание, чтобы получить требования, которые мне нужны?
  • Я уже написал код для выполнения всех вычислений и добавления / обновления словаря MyCustomObjects.
  • Примеры того, как реализовать эту привязку к сетке данных, будут очень благодарны.

1 Ответ

1 голос
/ 15 июля 2010

Для того, чтобы выполнить это, ваш Словарь должен реализовать IBindingList и запускать событие ListChanged всякий раз, когда вносятся изменения.Вот пример ( очень ) базовых реализаций IDictionary<TKey, TValue>, который также реализует IBindingList:

public class BindableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IBindingList
{
    private Dictionary<TKey, TValue> source = new Dictionary<TKey, TValue>();

    void IBindingList.AddIndex(PropertyDescriptor property) { }
    object IBindingList.AddNew() { throw new NotImplementedException(); }
    bool IBindingList.AllowEdit { get { return false; } }
    bool IBindingList.AllowNew { get { return false; } }
    bool IBindingList.AllowRemove { get { return false; } }
    void IBindingList.ApplySort(PropertyDescriptor property, ListSortDirection direction) { }
    int IBindingList.Find(PropertyDescriptor property, object key) { throw new NotImplementedException(); }
    bool IBindingList.IsSorted { get { return false; } }
    void IBindingList.RemoveIndex(PropertyDescriptor property) { }
    void IBindingList.RemoveSort() { }
    ListSortDirection IBindingList.SortDirection { get { return ListSortDirection.Ascending; } }
    PropertyDescriptor IBindingList.SortProperty { get { return null; } }
    bool IBindingList.SupportsChangeNotification { get { return true; } }
    bool IBindingList.SupportsSearching { get { return false; } }
    bool IBindingList.SupportsSorting { get { return false; } }
    int System.Collections.IList.Add(object value) { throw new NotImplementedException(); }
    void System.Collections.IList.Clear() { Clear(); }
    bool System.Collections.IList.Contains(object value) { if (value is TKey) { return source.ContainsKey((TKey)value); } else if (value is TValue) { return source.ContainsValue((TValue)value); } return false; }
    int System.Collections.IList.IndexOf(object value) { return -1; }
    void System.Collections.IList.Insert(int index, object value) { throw new NotImplementedException(); }
    bool System.Collections.IList.IsFixedSize { get { return false; } }
    bool System.Collections.IList.IsReadOnly { get { return true; } }
    void System.Collections.IList.Remove(object value) { if (value is TKey) { Remove((TKey)value); } }
    void System.Collections.IList.RemoveAt(int index) { throw new NotImplementedException(); }
    object System.Collections.IList.this[int index] { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } }

    private ListChangedEventHandler listChanged;

    event ListChangedEventHandler IBindingList.ListChanged
    {
        add { listChanged += value; }
        remove { listChanged -= value; }
    }

    protected virtual void OnListChanged(ListChangedEventArgs e)
    {
        var evt = listChanged;

        if (evt != null) evt(this, e);
    }

    public void Add(TKey key, TValue value)
    {
        source.Add(key, value);

        OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
    }

    public bool Remove(TKey key)
    {
        if (source.Remove(key))
        {
            OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));

            return true;
        }

        return false;
    }

    public TValue this[TKey key]
    {
        get
        {
            return source[key];
        }
        set
        {
            source[key] = value;

            OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
        }
    }

    void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
    {
        ((ICollection<KeyValuePair<TKey, TValue>>)source).Add(item);

        OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
    }

    bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)
    {
        if (((ICollection<KeyValuePair<TKey, TValue>>)source).Remove(item))
        {
            OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));

            return true;
        }

        return false;
    }

    public bool ContainsKey(TKey key) { return source.ContainsKey(key); }
    public ICollection<TKey> Keys { get { return source.Keys; } }
    public bool TryGetValue(TKey key, out TValue value) { return source.TryGetValue(key, out value); }
    public ICollection<TValue> Values { get { return source.Values; } }
    public void Clear() { source.Clear(); }
    bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item) { return ((ICollection<KeyValuePair<TKey, TValue>>)source).Contains(item); }
    void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) { ((ICollection<KeyValuePair<TKey, TValue>>)source).CopyTo(array, arrayIndex); }
    public int Count { get { return source.Count; } }
    bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly { get { return ((ICollection<KeyValuePair<TKey, TValue>>)source).IsReadOnly; } }
    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() { return source.GetEnumerator(); }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); }
    bool ICollection.IsSynchronized { get { return false; } }
    object ICollection.SyncRoot { get { return null; } }
    void ICollection.CopyTo(Array array, int arrayIndex) { ((ICollection)source).CopyTo(array,arrayIndex); }
}

К сожалению, выбранная строка может измениться или не измениться, в зависимости от того, какую сетку вы используете.Используешь.Лучше всего сохранить ключ выбранной строки всякий раз, когда он изменяется, а затем повторно выбирать эту строку (если имеется) при обновлении словаря.В противном случае, нет никакого способа гарантировать, что вы сохраните выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...