Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2018, 14:02   #1
tungsten
Пользователь
 
Регистрация: 05.11.2012
Сообщений: 16
По умолчанию добавить Column в DataGridView, но не руками!

Доброго дня вам друзья!
Начну с цели - хочу добавить в DataGridView некоторое кол-во Column, но не руками.

получаю схему из БД:
Код:
private void initDataSet(DataSet dataSet)
        {
            dataSet.Tables.Clear();
            DataTable dbTables = LoginForm.connection.GetSchema("Tables");
            foreach (DataRow dataRow in dbTables.Rows)
            {
                string tableName = dataRow["TABLE_NAME"].ToString();
                if (!string.IsNullOrEmpty(tableName) && !tableName.Equals("sysdiagrams", StringComparison.CurrentCultureIgnoreCase))
                {
                    DataTable tbl = new DataTable(tableName);
                    DataTable columnsTable = LoginForm.connection.GetSchema("Columns", new[] { null, null, tbl.TableName, null });
                    foreach (DataRow row in columnsTable.Rows)
                    {
                        DataColumn col = new DataColumn(row["COLUMN_NAME"].ToString());
                        col.DataType = row["DATA_TYPE"].GetType();
                        tbl.Columns.Add(col);
                    }
                    dataSet.Tables.Add(tbl);
                }
            }
        }

При некотором событии процедура должна добавить Columns в DataGridView из таблицы Users
Код:
private void tabControl1_Selected(object sender, TabControlEventArgs e)
        {
            initDataSet(dataSet1);
            if (dataSet1.Tables.Contains("users"))
            {
                int colcnt = dataSet1.Tables["users"].Columns.Count + 1;
                DataColumnCollection columns = dataSet1.Tables["users"].Columns;
                DataGridViewColumnCollection gridViewColumns = CreateColumn(columns, dataGridView1);
            }
 
        }
Явное преобразование DataColumnCollection в DataGridViewColumnCollection (если я правильно понял) просто не существует. Пытаюсь написать преобразовалку:

Код:
private DataGridViewColumnCollection CreateColumn(DataColumnCollection columns, DataGridView gridView)
        {
            DataGridViewColumnCollection gridViewColumnCollection = new DataGridViewColumnCollection(gridView);
            try
            {
                foreach (DataColumn column in columns)
                {
                    DataGridViewColumn gridViewColumn = new DataGridViewColumn();
                    gridViewColumn.HeaderText = column.ColumnName;
                    gridViewColumn.CellTemplate = new DataGridViewTextBoxCell();
                    gridViewColumnCollection.Add(gridViewColumn);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString(), "Проблема с добавлением столбца! Обратитесь к разработчикам.");
            }
            return gridViewColumnCollection;
        }
Так вот в преобразовалке на второй итерации Foreach (DataColumn column in columns) выполнение падает на gridViewColumnCollection.Add(gridVi ewColumn)
в стеке - $exception {"Заданный аргумент находится вне диапазона допустимых значений.\r\nИмя параметра: columnIndex"} System.ArgumentOutOfRangeException
Очевидно я упускаю инкремент columnIndex при добавлении нового столбца, по крайней мере это единственная моя мысль которая выглядит правдоподобно... Но блин! я не верю что при добавлении в Collection надо заботиться о его внутренней индексации?! И все же я в ступоре о_О
Чувствую себя оленем в свете фар...
tungsten вне форума Ответить с цитированием
Старый 15.12.2018, 20:03   #2
Nintra GrayWorker
Пользователь
 
Регистрация: 19.10.2018
Сообщений: 72
По умолчанию

Цитата:
Сообщение от tungsten Посмотреть сообщение
Так вот в преобразовалке на второй итерации Foreach (DataColumn column in columns) выполнение падает на gridViewColumnCollection.Add(gridVi ewColumn)
Я не могу воспроизвести ваш ход мыслей кодом(не вчитывался в код).
Если вы пытаетесь через Foreach добавить что-то или удалить - вы ломаете суть оператора/итератора. Нельзя так, если позволяет логика лучше через for сделайте, или проходите по итерациям сверху-вниз, если нижние значения удаляете.
А в верх, если добавляете и foreach - нельзя так издеваться над логикой программы.
Nintra GrayWorker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавить все строки из datagridview в checkedlistbox ольгаг C# (си шарп) 2 05.06.2018 18:06
Как добавить горизонтальную полосу прокрутки к Datagridview? Patriarc C# (си шарп) 3 07.05.2014 10:13
DataGridView Column Width vovik93 C# (си шарп) 0 03.11.2012 17:30
QTreeWidget last column artush1984 Qt и кроссплатформенное программирование С/С++ 6 23.05.2012 20:38
Как добавить текст из TextBox в DataGridView Arik80 Помощь студентам 4 20.06.2011 00:37