Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как отобразить Hashtable в Datagridview

40K
31 августа 2009 года
MixerLosev
26 / / 13.07.2009
Есть такой хэштэйбл HashTable(string, PluginInfo)
Где
struct PluginInfo
{
public bool avalible;
public bool active;
}


В DataGridView добавлено 2 колонки
Первая - c типом checkbox, вторая - textbox

Мой DataGridView выглядит следующим образом
----------------------------------------------------------
Active | Name |
--------------------------------------------------D--------

В строке с именем Active отображалось бы значение поля Active структуры PluginInfo (из значения хэш таблицы)
В строке с именем Avalible отображалось бы значение ключа хэш таблицы

Причем при изменении данных в гриде, данные в хэштаблице также бы менялись. Грид только отображает хэш-таблицу. Строки в гриде добавлять нельзя.
Кто-нибудь значет как это сделать?
5
01 сентября 2009 года
hardcase
4.5K / / 09.08.2005
Забудьте о .NET 1.1 и C# 1.2 версии, пробуйте .NET 3.5 и C# 3.0 - удобнее. В связи с этим настоятельно рекомендую использовать контейнерные классы пространства имен System.Collections.Generic, такие как Dictionary и List, а также крепко забыть Hashtable и ArrayList.

Таким образом код такой привязки может выглядеть вот так:
Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;

namespace WindowsFormsApplication9 {
    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();

            table.Add("Foo", new PluginInfo() {
                Available = true,
                Active = false
            });

            table.Add("Goo", new PluginInfo() {
                Available = true,
                Active = true
            });

            table.Add("Boo", new PluginInfo() {
                Available = false,
                Active = false
            });
        }

        struct PluginInfo {
            public bool Available;
            public bool Active;
        }


        private Dictionary<string, PluginInfo> table = new Dictionary<string, PluginInfo>();


        private void DisplayTable(DataGridView view, Dictionary<string, PluginInfo> table) {
            // формируем проекцию из последовательности Ключ-Значение нашего словаря
            view.DataSource = (from pair in table
                               select new {
                                   Name = pair.Key,
                                   Available = pair.Value.Available,
                                   Active = pair.Value.Active
                               }).ToArray();
        }


        private void button1_Click(object sender, EventArgs e) {
            DisplayTable(dataGridView1, table);
        }
    }
}
40K
01 сентября 2009 года
MixerLosev
26 / / 13.07.2009
Круто.
Спасибо, поробую.
Как я понимаю это LINQ?
5
01 сентября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: MixerLosev
Круто.
Спасибо, поробую.
Как я понимаю это LINQ?


Да, формально это LINQ, но в принципе можно и без него тут обойтись. "Запрос в памяти" нужен просто чтобы кода было меньше и он был читабельным. Мы из последовательности объектов, имеющих тип KeyValuePair<string, PluginInfo>, формируем эквивалентную последовательность объектов анонимного типа (конструкция new { } ). Компилятор автоматически сгенерирует объявление анонимного типа, это будет класс, имеющий 3 изменяемых свойства (видно из кода), к этим публичным свойствам и привязывается компонент DataGridView.

40K
01 сентября 2009 года
MixerLosev
26 / / 13.07.2009
Все благополучно работает.
А можно как-то синхронизировать изменения в datagridView и в table?
Т.е. изменил в гридвайве у плагина Foo свойство Avalible с true на false и эти изменения также произошли и в table
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог