c # - таблица целых чисел - datagridview - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь отобразить на Windomws формы datagridview. (для судоку) мой источник - таблица целых чисел.

Я использую источник данных, но при запуске ничего не отображается.

public Form1()
        {
            InitializeComponent();

            int[,] my_table = new int[9, 9] {
                    { 2,1,8,3,5,7,6,4,9},
                    { 5,7,3,4,9,6,8,2,1},
                    { 6,9,4,1,8,2,3,5,7},
                    { 1,6,9,5,2,8,4,7,3},
                    { 3,5,2,9,7,4,1,8,6},
                    { 4,8,7,6,1,3,2,9,5},
                    { 7,3,5,2,4,1,9,6,8},
                    { 8,2,1,7,6,9,5,3,4},
                    { 9,4,6,8,3,5,7,1,2}
                };


            dataGridView1.DataSource = my_table.ToString();

            dataGridView1.Refresh();

            dataGridView1.Invalidate();
        }

Мой результат - серый квадрат.

не могли бы вы помочь мне, пожалуйста?

PS: извините за мой английский, я француз

Ответы [ 3 ]

0 голосов
/ 11 октября 2019

привет и спасибо за ответы, но я не понимаю,

зачем использовать datatable? не могу напрямую получить данные из моего int [,]?

я пытаюсь это сделать:

public Form1()
{
    InitializeComponent();

    int[,] my_table = new int[9, 9] {
                { 2,1,8,3,5,7,6,4,9},
                { 5,7,3,4,9,6,8,2,1},
                { 6,9,4,1,8,2,3,5,7},
                { 1,6,9,5,2,8,4,7,3},
                { 3,5,2,9,7,4,1,8,6},
                { 4,8,7,6,1,3,2,9,5},
                { 7,3,5,2,4,1,9,6,8},
                { 8,2,1,7,6,9,5,3,4},
                { 9,4,6,8,3,5,7,1,2}
            };


    dataGridView1.DataSource = FillDTB(my_table) ;

    dataGridView1.Refresh();


    for(int ii=0; ii<9; ii++)
    {
        for (int jj = 0; jj < 9; jj++)
        {
            richTextBox1.Text += my_table[ii, jj];
            if (jj != 8)
            {
                richTextBox1.Text += ".";
            }
        }
        richTextBox1.Text += Environment.NewLine;


    }


    // dataGridView1.Invalidate();

}



private DataTable GetDTB(int count)
{
    DataTable tb = new DataTable();
    for (int i = 1; i < count + 1; i++)
    {
        tb.Columns.Add("C" + i);
    }
    return tb;
}

private DataTable FillDTB(int[,] matrix, int count = 9)
 {


     DataTable dtb = GetDTB(count);
     for (int i = 0; i < 9; i++)
     {
         dtb.Rows.Add(GetRow(matrix, i));
     }

     return dtb;
 }//*/


public int[] GetRow(int[,] matrix, int rowNumber)
{
    return Enumerable.Range(0, matrix.GetLength(1))
            .Select(x => matrix[rowNumber, x])
            .ToArray();
}

в моем поле richtext все в порядке, у меня есть мои значения. но в datagridview у меня есть оправдание "System.Int32 []" в первом столбце и ничего в другом.

что мне не хватает?

0 голосов
/ 11 октября 2019

ОК, я нашел.

public Form1()
{
    InitializeComponent();

    int[,] my_table = new int[9, 9] {

                { 8,2,3,4,5,9,1,6,7},
                { 6,9,7,8,1,2,5,6,4},
                { 5,1,4,6,7,3,2,9,8},
                { 7,4,1,3,9,6,8,2,5},
                { 3,6,5,1,2,8,7,4,9},
                { 2,8,9,5,4,7,6,1,3},
                { 1,5,2,7,3,4,9,8,6},
                { 9,3,8,2,6,5,4,7,1},
                { 4,7,6,9,8,1,3,5,2},

            };


    dataGridView1.DataSource = FillDTB(my_table) ;

    dataGridView1.Refresh();


    for(int ii=0; ii<9; ii++)
    {
        for (int jj = 0; jj < 9; jj++)
        {
            richTextBox1.Text += my_table[ii, jj];
            if (jj != 8)
            {
                richTextBox1.Text += ".";
            }
        }
        richTextBox1.Text += Environment.NewLine;


    }


     dataGridView1.Invalidate();

}

private DataTable GetDTB(int count)
{
    DataTable tb = new DataTable();
    for (int i = 1; i < count + 1; i++)
    {
        tb.Columns.Add();
    }
    return tb;
}

private DataTable FillDTB(int[,] matrix, int count = 9)
{


    DataTable dtb = GetDTB(count);

    for (int ii = 0; ii < count; ii++)
    {

        DataRow my_line;
        my_line = dtb.NewRow();

        for (int jj = 0; jj < count; jj++)
        {
            my_line[jj] = matrix[ii, jj];
        }

        dtb.Rows.Add(my_line);

    }

    return dtb;
 }//*/

это работа, но нет ответа, почему я не могу напрямую использовать свои 2-мерные данные в datagridview.

спасибо

0 голосов
/ 10 октября 2019

Попробуйте:

Метод GetRow взят из: https://stackoverflow.com/a/51241629/1623971

private DataTable GetDTB(int count)
            {
                DataTable tb = new DataTable();
                for (int i = 1; i < count + 1; i++)
                {
                    tb.Columns.Add("C" + i);
                }
                return tb;
            }

            private DataTable FillDTB(int count = 9)
            {
                int[,] my_table = new int[9, 9] {
                        { 2,1,8,3,5,7,6,4,9},
                        { 5,7,3,4,9,6,8,2,1},
                        { 6,9,4,1,8,2,3,5,7},
                        { 1,6,9,5,2,8,4,7,3},
                        { 3,5,2,9,7,4,1,8,6},
                        { 4,8,7,6,1,3,2,9,5},
                        { 7,3,5,2,4,1,9,6,8},
                        { 8,2,1,7,6,9,5,3,4},
                        { 9,4,6,8,3,5,7,1,2}
                    };

                DataTable dtb = GetDTB(count);
                for (int i = 0; i < 9; i++)
                {
                    dtb.Rows.Add(GetRow(my_table, i));
                }

                return dtb;
            }


            public int[] GetRow(int[,] matrix, int rowNumber)
            {
                return Enumerable.Range(0, matrix.GetLength(1))
                        .Select(x => matrix[rowNumber, x])
                        .ToArray();
            }
...