DataTable отказывается заполняться строками - PullRequest
0 голосов
/ 30 апреля 2018

Я не могу заставить мою System.Data.DataTable принимать какие-либо новые строки вообще. Ниже приведен код, который используется.

using System.Data;
using System.Windows.Forms;

namespace DataTableToDGVTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            DataTable dataTable = new DataTable();
            dataTable.Columns.Add("id", typeof(int));
            dataTable.Columns.Add("name", typeof(string));

            DataRow dataRow = dataTable.NewRow(); 
            dataRow["id"] = "1";
            dataRow["name"] = "Jesse";
            dataTable.Rows.Add(dataRow);

            //Tried this as well, still doesn't work
            //dataTable.Rows.Add(1, "Jesse");
        }
    }
}

Во время отладки я заметил, что DataTable.Rows.Count увеличится с 0 до 1, однако DataTable.Rows.List останется нулевым, как показано на следующем рисунке List remains null

Я запустил этот код в .NET Framework 4.6 и только что попробовал в 4.7.1 с обоими результатами, которые были идентичны.

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Вы осматриваете не ту часть объекта. То, что вы должны проверять, это dataTable => rows => Results View => [0] => ItemArray. См. Ниже (более расширенную версию) вашего кода, чтобы лучше продемонстрировать.

static void Main(string[] args)
        {
            var dataTable = new DataTable();
            dataTable.Columns.Add("id", typeof(int));
            dataTable.Columns.Add("name", typeof(string));

            var rowCount = dataTable.Rows.Count;
            Console.WriteLine(rowCount);

            var dataRow = dataTable.NewRow();
            dataRow["id"] = "1";
            dataRow["name"] = "Jesse";
            dataTable.Rows.Add(dataRow);

            var rowCountAfterAdding = dataTable.Rows.Count;
            Console.WriteLine(rowCountAfterAdding);
            foreach (DataRow row in dataTable.Rows)
            {
                foreach (var ia in row.ItemArray)
                {
                    Console.WriteLine(ia);
                }
            }
        }
0 голосов
/ 30 апреля 2018

Свойство List класса DataRowCollection в соответствии с документацией недоступно для использования. Смотрите эту ссылку

Вы видите свойство List в отладчике, поскольку DataRowCollection наследуется от InternalDataCollectionBase, и в этом классе свойство List защищено. Смотрите эту документацию

Так вот почему вы получаете ошибку, и вам не нужно смотреть на свойство List. Это не тот объект.

0 голосов
/ 30 апреля 2018

Что показывают часы dataTable.Rows[0]?

Вы пробовали пример из MSDN класса DataTable ?

private static void ShowTable(DataTable table) {
  foreach (DataColumn col in table.Columns) {
     Console.Write("{0,-14}", col.ColumnName);
  }
  Console.WriteLine();

  foreach (DataRow row in table.Rows) {
     foreach (DataColumn col in table.Columns) {
        if (col.DataType.Equals(typeof(DateTime)))
           Console.Write("{0,-14:d}", row[col]);
        else if (col.DataType.Equals(typeof(Decimal)))
           Console.Write("{0,-14:C}", row[col]);
        else
           Console.Write("{0,-14}", row[col]);           
     }
     Console.WriteLine();
  }
  Console.WriteLine();
}

Еще один быстрый комментарий после вашего комментария о пустом контроле. dataTable является локальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...