none
VS 2010. C#. Windows Forms. Вопрос по проверке в DataGridView. RRS feed

  • Вопрос

  • Здравствуйте.

    У меня получилось сделать проверку при нажатии на кнопку. Как сделать, что бы в Датагриде подсвечивались ячейки с неправильными цифрами, то есть, если одинаковые по столбцам/строчкам/в 3х3 квадрате(правила игры в судоку) ?

    Я как понимаю, что это через CellMouseClick выполнять надо...

    И еще, я искал в свойствах датагрида, но не нашел, как изменять толщину определенных границ ячеек (мне нужно, что в квадрате 9х9 ячеек маленькие 3х3 были бы разделены жирной границей).

    Boolean Check(Int32[,] Desk)
            {
                Int32[] D = new Int32[10];
                //строки
                for (int i = 0; i < 9; i++)
                {
                    D = new Int32[10];
                    for (int j = 0; j < 9; j++)
                    {
                        D[Desk[i, j]]++;
                    }
    
                    for (int j = 0; j < 10; j++)
                    {
                        if (D[j] > 1)
                            return false;
                    }
                }
                //столбцы
                for (int i = 0; i < 9; i++)
                {
                    D = new Int32[10];
                    for (int j = 0; j < 9; j++)
                    {
                        D[Desk[j, i]]++;
                    }
                    for (int j = 0; j < 10; j++)
                    {
                        if (D[j] > 1)
                            return false;
                    }
                }
    
                //квадраты
                for (int K = 0; K <= 6; K+=3)
                {
                    //D = new Int32[10];
                    Int32 temp = 0;
                    for (int i = 0; i < 3; i++)
                        for (int j = 0; j < 3; j++)
                        {
                            temp += Desk[i + K, j + K];
                        }
                                    
                    if (temp != 45)
                        return false;
                }
                return true;
            }


    • Перемещено Abolmasov Dmitry 21 июня 2012 г. 10:24 (От:Языки программирования)
    5 июня 2012 г. 19:10

Ответы

Все ответы

  • > У меня получилось сделать проверку при нажатии на кнопку.

    Какую проверку? На какую кнопку?



    > Я как понимаю, что это через CellMouseClick выполнять надо...

    Что это?


    > И еще, я искал в свойствах датагрида, но не нашел, как изменять толщину определенных границ ячеек (мне нужно, что в квадрате 9х9 ячеек маленькие 3х3 были бы разделены жирной границей).

    Простого способа нет. Можно рисовать границы ячеек самостоятельно в событии CellPainting. Но это довольно сложно.

    Проще будет рисовать дополнительную сетку поверх всего DataGridView в событии Paint:

    private void dataGridView1_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        int width = dataGridView1.Columns[0].Width;
        int height = dataGridView1.Rows[0].Height;
    
        using (Pen pen = new Pen(Color.Black, 3))
            for (int x = 0; x < 4; ++x)
            {
                g.DrawLine(pen, x * width * 3, 0, x * width * 3, 9 * height);
                g.DrawLine(pen, 0, x * height * 3, 9 * height, x * height * 3);
            }
    }

    В примере предполагается, что ширина всех колонок одинакова, высота всех строк одинакова, и что заголовки строк и колонок убраны.
  • > Какую проверку? На какую кнопку?

    При нажатии на кнопку Check Answers он проверяет Check(Desk) если стоит true, он выдает сообщение "Решение верно".

    Но нужно, что бы он закрашивал красным ячейки с неправильными цифрами (по правилам судоку).

  • У DataGridView есть свойство Items[,] которое возвращает DataGridViewCell (http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcell.aspx) у которого в свою очередь есть свойство Style (http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcellstyle.aspx) попробуйте поиграться со свойством BackColor

    что то в стиле DataGridView.Items[i,j].Style.BackColor = Color.Red;

    • Предложено в качестве ответа Abolmasov Dmitry 7 июня 2012 г. 6:39
    • Помечено в качестве ответа Abolmasov Dmitry 21 июня 2012 г. 10:23
  • Не забудьте отметить ответ, если он решит вашу проблему. Спасибо.

    Для связи [mail]