Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> столбец, вычисляемый функцией, в DataSet-е 
:(
    Опции темы
sindi8
Дата 27.1.2006, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



Всем добрый день.
Подскажите пожалуйста, как мне решить следующую проблему:
у меня есть поле А считанное из базы. Мне нужно сделать вычисляемый столбец В, но значение столбца генерируется на основе класса, который в свою очередь генерится на основе значения в столбце A.
Спасибо.
PM MAIL   Вверх
mr.DUDA
Дата 27.1.2006, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 8
Всего: 232



Можно подписаться на событие ColumnChanged (аналог RowChanged для отдельно взятой колонки таблицы датасета), оно будет генерироваться при любых изменениях любых полей таблицы, и всё что останется - это проверить что за поле изменилось и вычислить значение другого поля:

Код
using System;
using System.Data;

// Класс, вычисляющий значение поля B по полю A
class B_FieldCalculator
{
    public static void OnFieldChanged(object sender, DataColumnChangeEventArgs e)
    {
        if(e.Column.ColumnName == "A")
            e.Row["B"] = (int)e.Row["A"] + 123;
    }
}


// Тестовый пример
class TestApp
{
    static void Main(string[] args)
    {
        // создаём датасет с двумя полями: A и B
        DataSet dataSet = new DataSet();
        DataTable table = dataSet.Tables.Add();
        table.Columns.Add("A", typeof(int));
        table.Columns.Add("B", typeof(int));

        // подписываемся на событие "поле таблицы изменилось"
        table.ColumnChanged += new DataColumnChangeEventHandler(B_FieldCalculator.OnFieldChanged);

        // добавляем две записи в таблицу
        DataRow row1 = table.Rows.Add(0, 0);
        DataRow row2 = table.Rows.Add(0, 0);
        row1["A"] = 100;
        row2["A"] = 200;

        // проверяем результат
        Console.WriteLine(row1["B"].ToString()); // 223
        Console.WriteLine(row2["B"].ToString()); // 323
    }

}


Другой способ, без отдельного класса - это назначить колонке таблицы св-во Expression. С его помощью можно выполнить достаточно богатый набор операций над другими колонками таблицы, числовыми и строковыми константами, задействовать встроенные функции (IIF, ISNULL, CONVERT, LEN, SUBSTRING, TRIM). Получим колонку с автоматически вычисляемым значением. Простой пример:

Код
using System;
using System.Data;


// Тестовый пример
class TestApp
{
    static void Main(string[] args)
    {
        // создаём датасет с двумя полями: A и B
        DataSet dataSet = new DataSet();
        DataTable table = dataSet.Tables.Add();
        table.Columns.Add("A", typeof(int));
        
        DataColumn colB = table.Columns.Add("B", typeof(int));
        colB.Expression = "A + 123456";

        // добавляем две записи в таблицу
        DataRow row1 = table.Rows.Add(0, 0);
        DataRow row2 = table.Rows.Add(0, 0);
        row1["A"] = 100000;
        row2["A"] = 200000;

        // проверяем результат
        Console.WriteLine(row1["B"].ToString()); // 223456
        Console.WriteLine(row2["B"].ToString()); // 323456
    }

}



--------------------
user posted image
PM MAIL WWW   Вверх
sindi8
Дата 30.1.2006, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



Ээээ, не совсем то что надо. Первый вариант работает только тогда, когда именно "меняется" значение в ячейке таблицы. Когда данные читаются из базы - событие не отрабатывается. Ну а второй вариант не подходит по условию - в том то все и дело что стандартных "заготовок" операций не достаточно. Помимо этих вариантов умные люди говорили что-то про DataBinding, но сам я никак это дело не осмыслю.
PM MAIL   Вверх
arilou
Дата 30.1.2006, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 4
Всего: 61



Цитата(sindi8 @ 30.1.2006, 14:17 Найти цитируемый пост)

Первый вариант работает только тогда, когда именно "меняется" значение в ячейке таблицы. Когда данные читаются из базы - событие не отрабатывается.

Неправда. Надо просто чуть-чуть изменить поведение датасета, и будут тебе пересчитываться колонки при его заполнении. Например, наследуйся от него и вперед.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
sindi8
Дата 30.1.2006, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 6.6.2005
Где: Москва

Репутация: нет
Всего: нет



Ага, согласен. По идее должно спасти. Сейчас я обошелся написанием функции в MSSQL. А на будущее - попробую.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.