Управление C # DataGridView с помощью Arraylist в VS2008 - PullRequest
1 голос
/ 26 ноября 2008

У меня проблемы с элементом datagridview, который я использую в VS2008. Этот DataGridView фактически является вкладкой в ​​элементе TabControl.

Я дал ему 5 столбцов, которые должны быть заполнены элементами из костюма Объекта, который я сделал.

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

Мне нужны только первые 5, хотя некоторые объекты будут иметь до 12 ключевых слов. В настоящее время всякий раз, когда я добавляю объект, сетка данных не заполняется сама собой, вместо этого она добавляет количество столбцов, равное количеству ключевых слов, которые есть у конкретного объекта.

Что я сейчас делаю, так это:

public void libDataGrid_Click(object sender, EventArgs e)
        {
            if(this.manager.Lib.LibList[0] != null)
            {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
            }
        }

this.manager.Lib.LibList возвращает и ArrayList, в котором хранятся все объекты. ArrayList может содержать элементы всех производных классов, но, поскольку они все связаны, строковое представление всегда будет содержать элементы, необходимые для заполнения сетки.

Я не вижу, как я могу отфильтровать только первые пять, и им нужно поместить их в правильные столбцы.

И еще одна вещь. В настоящее время я могу только обновить DataGridView, нажав на него. Это должно измениться, когда я переключаюсь на это, переключаюсь к его определенной вкладке на Tabcontrol, я имею в виду.

Я попытался добавить аргумент для SelectedIndexChanged, но это ничего не дает на самом деле ... Или, по крайней мере, он ничего не делает.

Я имею в виду, что я закомментировал код выше и добавил вместо этого:

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
        }

Это обновляет его при каждом изменении вкладки, независимо от того, на какую. Мне пришлось удалить оператор if, поскольку он дал мне исключение. Возможно, потому что длина ArrayList не установлена ​​при инициализации.

Ответы [ 3 ]

3 голосов
/ 26 ноября 2008

Я немного смущен вопросом, но вот некоторые мысли:

  1. DataGridView имеет свойство AutoGenerateColumn s ; если вы не хотите, чтобы он создавал свои собственные столбцы, установите для этого параметра значение false
  2. Для привязки к существующим столбцам DataPropertyName должен быть установлен на каждом
  3. DataGridView (в смомонах с любым элементом управления списком, использующим TypeDescriptor), чрезвычайно предпочтет List<T> (для некоторых T! = object) ArrayList, поскольку он может получать метаданные даже пустой список. В общем, в 2.0 использование ArrayList является ошибкой.
0 голосов
/ 26 ноября 2008

Если я понимаю вашу проблему, она кажется похожей на проблему, с которой я недавно боролся в этой теме на DataGridViews в C # /. NET2.0

Попробуйте позвонить:

libDataGrid.Invalidate();

Это должно заставить Windows перерисовать ваш контроль. Не нужно повторно подключать источник данных и обновлять. (Я думаю, что вы можете смело закомментировать эти 2 строки.)

Также: Какое исключение вы получили?

А вы использовали «Мастер настройки источника данных», чтобы помочь вам с dataGridView?

0 голосов
/ 26 ноября 2008

Я могу дать только частичный ответ, но я думаю, что причина

public void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
        {
                libDataGrid.DataSource = this.manager.Lib.LibList;
                libDataGrid.Refresh();
        }

не работает, потому что вам нужно добавить эту строку, где инициализируется tabControl1. У меня была такая проблема, когда VS сам этого не сделает.

tabControl1.SelectedIndexChanged += new EventHandler(tabControl1_SelectedIndexChanged);
...