Настройка DataGridView CellTemplate не работает должным образом

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

Сначала я создал класс, содержащий параметр Column:

public class ColumnBLO
{
    public string foreColor { get; set; }
    public string backColor { get; set; }
    public string Label { get; set; }
}

Тогда вот код для моего главного окна:

        private Dictionary<string, DataGridView> dgViews;
    private List<ColumnBLO> columns;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        tabControl1.TabPages.Clear();
        tabControl1.TabPages.Add(new TabPage("laUNe"));

        //Simulating Format settings
        columns = new List<ColumnBLO>();
        columns.Add(new ColumnBLO { backColor = "Black", foreColor = "Black", Label = "one" });
        columns.Add(new ColumnBLO { backColor = "Blue", foreColor = "Blue", Label = "two" });
        columns.Add(new ColumnBLO { backColor = "Red", foreColor = "Red", Label = "three" });

        //Creating datagridviews and populate with data
        dgViews = new Dictionary<string, DataGridView>();
        DataGridView dgv = new DataGridView();

        DataTable dt = new DataTable("laTable");
        dt.Columns.Add("one");
        dt.Columns.Add("two");
        dt.Columns.Add("three");
        dt.Rows.Add("un", "deux", "trois");
        dt.Rows.Add("un", "dos", "tres");
        dt.Rows.Add("uno", "due", "tre");
        dgv.DataSource = dt;

        dgViews.Add("one", dgv);

        tabControl1.TabPages[0].Controls.Add(dgv);

        //Formatting
        foreach (DataGridViewColumn dgvcol in dgViews["one"].Columns)
        {
            ColumnBLO colB = columns.Where(x => x.Label == dgvcol.HeaderText).First();
            DataGridViewCell dgvc = new DataGridViewTextBoxCell();
            dgvc.Style.BackColor = Color.FromName(colB.backColor);
            dgvc.Style.ForeColor = Color.FromName(colB.foreColor);
            dgvcol.CellTemplate = dgvc;
        }

    }
}

Когда я выполняю этот код, форматирование не отображается, так как я нажимаю на столбец заголовка (для сортировки столбца) или если я вызываю метод Sort.

Я пробовал много вещей, таких как Refresh(), Invalidate() и InvalidateColumns() в DGV, но ничего не работает...

Если бы кто-нибудь мог мне помочь ;-)


person metalcam    schedule 20.08.2012    source источник
comment
+1 за то, что вы предоставили такой код, и особенно за предоставление отредактированной версии только с кодом для воспроизведения проблемы. Если бы все так делали, мир был бы лучше.   -  person David Hall    schedule 20.08.2012


Ответы (1)


Замените цикл foreach следующим...

...

//Formatting
foreach(DataGridViewColumn dgvcol in dgViews["one"].Columns)
{
     ColumnBLO colB = columns.First(x => x.Label == dgvcol.HeaderText);
     dgvcol.DefaultCellStyle.BackColor = Color.FromName(colB.BackColor);
     dgvcol.DefaultCellStyle.ForeColor = Color.FromName(colB.ForeColor);
}

...

Если вы используете DefaultCellStyle вместо CellStyle, ячейки будут отображаться вашим шаблоном по умолчанию... Душа как Капитан Очевидность )))

person Dmytro    schedule 20.08.2012