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);
}
}
}
Как отобразить Hashtable в Datagridview
Где
struct PluginInfo
{
public bool avalible;
public bool active;
}
В DataGridView добавлено 2 колонки
Первая - c типом checkbox, вторая - textbox
Мой DataGridView выглядит следующим образом
----------------------------------------------------------
Active | Name |
--------------------------------------------------D--------
В строке с именем Active отображалось бы значение поля Active структуры PluginInfo (из значения хэш таблицы)
В строке с именем Avalible отображалось бы значение ключа хэш таблицы
Причем при изменении данных в гриде, данные в хэштаблице также бы менялись. Грид только отображает хэш-таблицу. Строки в гриде добавлять нельзя.
Кто-нибудь значет как это сделать?
Забудьте о .NET 1.1 и C# 1.2 версии, пробуйте .NET 3.5 и C# 3.0 - удобнее. В связи с этим настоятельно рекомендую использовать контейнерные классы пространства имен System.Collections.Generic, такие как Dictionary и List, а также крепко забыть Hashtable и ArrayList.
Спасибо, поробую.
Как я понимаю это LINQ?
Цитата: MixerLosev
Круто.
Спасибо, поробую.
Как я понимаю это LINQ?
Спасибо, поробую.
Как я понимаю это LINQ?
Да, формально это LINQ, но в принципе можно и без него тут обойтись. "Запрос в памяти" нужен просто чтобы кода было меньше и он был читабельным. Мы из последовательности объектов, имеющих тип KeyValuePair<string, PluginInfo>, формируем эквивалентную последовательность объектов анонимного типа (конструкция new { } ). Компилятор автоматически сгенерирует объявление анонимного типа, это будет класс, имеющий 3 изменяемых свойства (видно из кода), к этим публичным свойствам и привязывается компонент DataGridView.
А можно как-то синхронизировать изменения в datagridView и в table?
Т.е. изменил в гридвайве у плагина Foo свойство Avalible с true на false и эти изменения также произошли и в table