сортировка и обновление данных, не дающих ожидаемых результатов - PullRequest
0 голосов
/ 31 марта 2011

РЕДАКТИРОВАТЬ: Решил это сам - очевидно, не будет работать, так как сортировка dataTable не сортирует базовые данные - создал DataView из таблицы, работает нормально.

У меня есть таблица данных, которую я сортирую, а затем перебираю, чтобы удалить повторяющиеся значения в одном столбце, однако выходные данные не соответствуют ожидаемым.

Структура данных:

infoRow["Title"]
infoRow["QuickLink"]
infoRow["Description"]
infoRow["Date"]
infoRow["MonthName"]

Я сортирую вот так, все работает нормально и выдает таблицу, упорядоченную в порядке возрастания месяца:

dataTable = dataTable.DefaultView.ToTable(true);
dataTable.DefaultView.Sort = "Date asc";

После сортировки я использую приведенный ниже код для сравнения каждой строки с предыдущей, и если значение MonthName совпадает, замените его пустой строкой:

string prevMonthName = "";
foreach (DataRow row in dtEvents.Rows)
{
    string strMonthName = row["MonthName"].ToString();
    if (strMonthName == prevMonthName)
    {
        row["MonthName"] = "";
        row.AcceptChanges();
    }
    prevMonthName = strMonthName;
}           

Итак, проблема, с которой я столкнулся, заключается в том, что даже когда я запускаю цикл MonthName после сортировки, он работает с несортированными данными. Это как DefaultView.Sort влияет только на визуализированный вывод без физического переупорядочения таблицы, поэтому вторая часть кода не дает нужного мне результата. Должен ли я использовать DataView или я просто не в курсе ...

Ответы [ 3 ]

2 голосов
/ 21 апреля 2011

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

dataTable.DefaultView.Sort = "Date ASC";
dataTable = dataTable.DefaultView.ToTable(true);

Теперь первая строка кода сортирует DefaultView.Этого будет достаточно для вашего DataGridView или ComboBox или чего-либо, что вы используете для отображения, потому что они используют DefaultView.Однако сама DataTable остается несортированной.Таким образом, вторая строка устанавливает DataTable, чтобы он выглядел точно так же, как отсортированный DefaultView.

Я только что заметил вашу правку вверху, которая говорит, что вы ее решили.Это «решение» кажется скорее обходным путем.Видя, как у вас был правильный код , но в неправильном порядке , я подумал, что вас заинтересует этот ответ.

0 голосов
/ 31 марта 2011

Ради интереса я разобрался, как это сделать, используя Linq to SQL (при условии, что у меня есть таблица sql с вашей схемой выше). Поскольку я потратил время на то, чтобы понять это, я подумал, что мог бы поделиться этим.

// Order the table and add an index column
var ordered = MonthTests.OrderBy(mt => mt.Date)
                        .AsEnumerable()
                        .Select((mt, index) => new
                        {
                            OrderId = index,
                            Record = mt
                        });

// Select out what we want
var query = from item in ordered
            let prev = ordered.FirstOrDefault (q => q.OrderId == (item.OrderId-1))
            select new 
            { 
                Title = item.Record.Title,
                QuickLink = item.Record.QuickLink,
                Date = item.Record.Date,
                MonthName = (prev != null && prev.Record.MonthName == item.Record.MonthName) ? "" : item.Record.MonthName
            };

Веселись.

0 голосов
/ 31 марта 2011

Предполагая, что dtEvents ссылается на тот же объект, что и datatable, вы можете попробовать это:

string prevMonthName = "";
foreach (DataRowView row in dtEvents.DefaultView)
{
    string strMonthName = row["MonthName"].ToString();
    if (strMonthName == prevMonthName)
    {
        row["MonthName"] = "";
        row.AcceptChanges();
    }
    prevMonthName = strMonthName;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...