Заполнение DataGridView через DataTable. При применении фильтрации или сортировки сбрасываются настройки строк DataGridView

472
15 августа 2017, 12:09

Для применения фильтрации на самом контролле (не в модели данных) использую DataTable для создания таблицы и DataView.

Проблема: после применения фильтра btn_Filter_Click и после применения сортировки (нажатие на колонку) значение dgv_TrainTable.Rows[i] сбрасывается.

dgv_TrainTable.Rows[i].Tag = null
dgv_TrainTable.Rows[i].DefaultCellStyle.BackColor = цвет по умолчанию
public partial class Form1 : Form
{
    public List<TableRec> TableRecs { get; set; } = new List<TableRec>
    {
        new TableRec { Id = 1, Number = "558", ArrivalTime = "00:07", DepartureTime = "00:30", Route = "Череповец-Адлер", DaysFollowing = "Выборочные дни: Май:26"},
        new TableRec { Id = 2, Number = "516", ArrivalTime = "00:17", DepartureTime = "01:30", Route = "Сыктывкар-Адлер", DaysFollowing = "Выборочные дни: Движение отсутсвует"},
        new TableRec { Id = 3, Number = "698", ArrivalTime = "13:07", DepartureTime = "14:30", Route = "Кострома-Москва", DaysFollowing = "Выборочные дни: Ежедневно"},
        new TableRec { Id = 4, Number = "496", ArrivalTime = "14:07", DepartureTime = "15:30", Route = "Архангельск-Адлер", DaysFollowing = "Выборочные дни: Ежедневно"},
        new TableRec { Id = 5, Number = "386", ArrivalTime = "15:07", DepartureTime = "17:55", Route = "Череповец-Адлер", DaysFollowing = "Выборочные дни: Движение отсутсвует"},
        new TableRec { Id = 4, Number = "666", ArrivalTime = "14:07", DepartureTime = "15:30", Route = "Архангельск-Москва", DaysFollowing = "Выборочные дни: Ежедневно"},
    };
    public DataTable DataTable { get; set; }
    public DataView DataView { get; set; }
    public Form1()
    {
        InitializeComponent();
        CreateDataTable();
    }
    private void CreateDataTable()
    {
        //Создание  таблицы
        DataTable = new DataTable("MAIN_TABLE");
        List<DataColumn> columns = new List<DataColumn>
        {
            new DataColumn("Id", typeof(int)),
            new DataColumn("Номер", typeof(string)),
            new DataColumn("ВремяПрибытия", typeof(string)),
            new DataColumn("ВремяОтправления", typeof(string)),
            new DataColumn("Маршрут", typeof(string)),
            new DataColumn("ДниСледования", typeof(string))
        };
        DataTable.Columns.AddRange(columns.ToArray());
        DataView = new DataView(DataTable);
        dgv_TrainTable.DataSource = DataView;
        //форматирование колонок DataGridView----------------------------
        for (int i = 0; i < dgv_TrainTable.Columns.Count; i++)
        {
            var col = dgv_TrainTable.Columns[i];
            col.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            switch (col.Name)
            {
                case "Id":
                    col.HeaderText = @"Id";
                    break;
                case "Номер":
                    col.HeaderText = @"Номер";
                    break;
                case "ВремяПрибытия":
                    col.HeaderText = @"Время прибытия";
                    break;
                case "ВремяОтправления":
                    col.HeaderText = @"Время отправления";
                    break;
                case "Маршрут":
                    col.HeaderText = @"Маршрут";
                    break;
                case "ДниСледования":
                    col.HeaderText = @"Дни следования";
                    break;
            }
        }
    }
    protected override void OnLoad(EventArgs e)
    {
        //Заполнение данными
        DataTable.Rows.Clear();
        for (var i = 0; i < TableRecs.Count; i++)
        {
            var rec = TableRecs[i];
            var row = DataTable.NewRow();
            row["Id"] = rec.Id;
            row["Номер"] = rec.Number;
            row["ВремяПрибытия"] = rec.ArrivalTime;
            row["ВремяОтправления"] = rec.DepartureTime;
            row["Маршрут"] = rec.Route;
            row["ДниСледования"] = rec.DaysFollowing;
            DataTable.Rows.Add(row);
            dgv_TrainTable.Rows[i].DefaultCellStyle.BackColor = Color.LightGreen; //!!! создаю настройки для строк
            dgv_TrainTable.Rows[i].Tag = rec.Id;
        }
        base.OnLoad(e);
    }
    //Применение фильтра
    private void btn_Filter_Click(object sender, EventArgs e)
    {
        string filter= String.Empty;
        if (!(string.IsNullOrEmpty(tb_НомерПоезда.Text) || string.IsNullOrWhiteSpace(tb_НомерПоезда.Text)))
        {
            filter = $"Номер = '{tb_НомерПоезда.Text}'";
        }
        DataView.RowFilter = filter;
    }       
}
READ ALSO
Можно ли залить уже готовый проект на .NET Fiddle? [требует правки]

Можно ли залить уже готовый проект на .NET Fiddle? [требует правки]

Как залить свою программу наNET Fiddle ? Или там можно только что-то писать онлайн?

148
How to add page into new document itextsharp c#? [требует правки]

How to add page into new document itextsharp c#? [требует правки]

I create new PDF documentHow add new page into itextsharp document? I use this and get an error: Unbalanced begin/end text operators

281
Очистка данных таблицы базы данных Access

Очистка данных таблицы базы данных Access

Мне нужно очистить базу данныхЯ делал это так:

185
Выполнение кода из textbox

Выполнение кода из textbox

Помогите реализовать такую идею: Ввожу в textbox1 определенный код и при нажатии на кнопку он выполняетсяИдеи с if(

236