cool999
1

Получение данных с программно созданных элементов

27.11.2011, 19:23. Показов 4463. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Использую следующий код для программного создания DataGridView.
Вопрос: Как теперь получить доступ к созданному элементу
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using FirebirdSql.Data.FirebirdClient;
 
namespace WindowsFormsApplication4
{
    public partial class Form1 : Form
    {
        DataGridView _grid;
        public Form1()
        {
            InitializeComponent();
 
            
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            DataGridView _grid = new DataGridView();
            _grid.Dock = DockStyle.Fill;
            _grid.AllowUserToAddRows = false;
            Controls.Add(_grid);
            _grid.Columns.Add(new DataGridViewTextBoxColumn());
            _grid.Columns[0].HeaderText = "TextBoxColumn";
            _grid.Columns.Add(new DataGridViewLinkColumn());
            _grid.Columns[1].HeaderText = "LinkColumn";
            _grid.Columns.Add(new DataGridViewButtonColumn());
            _grid.Columns[2].HeaderText = "ButtonColumn";
            _grid.Columns.Add(new DataGridViewCheckBoxColumn());
            _grid.Columns[3].HeaderText = "CheckBoxColumn";
            _grid.Columns.Add(new DataGridViewComboBoxColumn());
            _grid.Columns[4].HeaderText = "ComboBoxColumn";
            _grid.Columns.Add(new DataGridViewImageColumn());
            _grid.Columns[5].HeaderText = "ViewImageColumn";
 
            _grid.Rows.Add();
 
            for (int i = 0; i <= 3; i++)
            {
                DataGridViewRow heter_row = new DataGridViewRow();
 
                for (int j = 0; j < _grid.Columns.Count; j++)
                    heter_row.Cells.Add(new DataGridViewTextBoxCell());
 
                switch (i)
                {
                    case 0:
                        heter_row.HeaderCell.Value = "Value";
                        break;
                    case 1:
                        heter_row.HeaderCell.Value = "ValueType";
                        break;
                    case 2:
                        heter_row.HeaderCell.Value = "FormattedValue";
                        break;
                    case 3:
                        heter_row.HeaderCell.Value = "FormattedValueType";
                        break;
                }
 
                _grid.Rows.Add(heter_row);
            }
 
            // Заполнение строки 0
 
            DataGridViewRow row0 = _grid.Rows[0];
            row0.HeaderCell.Value = "Внешний вид ячейки";
 
            DataGridViewTextBoxCell cell0 = (DataGridViewTextBoxCell)row0.Cells[0];
            cell0.Value = "dotNET";
 
            DataGridViewLinkCell cell1 = (DataGridViewLinkCell)row0.Cells[1];
            cell1.Value = "RSDN.ru";
 
            DataGridViewButtonCell cell2 = (DataGridViewButtonCell)row0.Cells[2];
            cell2.Value = "Accept";
 
            DataGridViewCheckBoxCell cell3 = (DataGridViewCheckBoxCell)row0.Cells[3];
            cell3.Value = true;
 
            DataGridViewComboBoxCell cell4 = (DataGridViewComboBoxCell)row0.Cells[4];
            cell4.Items.AddRange(new string[] { "Trace", "Debug", "Release" });
            cell4.Value = "Release";
 
            DataGridViewImageCell cell5 = (DataGridViewImageCell)row0.Cells[5];
            cell5.ImageLayout = DataGridViewImageCellLayout.Zoom;
            cell5.Value = Image.FromFile(@"C:\1\1.bmp");
 
            // Заполнение строки 1
            for (int j = 0; j < _grid.Columns.Count; j++)
                _grid.Rows[1].Cells[j].Value = _grid.Rows[0].Cells[j].Value.ToString();
 
            // Заполнение строки 2
            for (int j = 0; j < _grid.Columns.Count; j++)
                _grid.Rows[2].Cells[j].Value =
                 _grid.Rows[0].Cells[j].ValueType.ToString();
 
            // Заполнение строки 3
            for (int j = 0; j < _grid.Columns.Count; j++)
                _grid.Rows[3].Cells[j].Value =
                  _grid.Rows[0].Cells[j].FormattedValue.ToString();
 
            // Заполнение строки 4
            for (int j = 0; j < _grid.Columns.Count; j++)
                _grid.Rows[4].Cells[j].Value =
                  _grid.Rows[0].Cells[j].FormattedValueType.ToString();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            //int p = Convert.ToInt32(this._grid.CurrentRow.Cells[0].Value);
           /* DataGridViewComboBoxCell cell =
    (DataGridViewComboBoxCell)_grid.Rows[2].Cells[0];
            cell.Items.Clear();
            cell.Items.AddRange(new string[] { "ABC", "KLM", "XYZ" });*/
 
            DataGridViewComboBoxCell comboCell = (DataGridViewComboBoxCell)_grid.Rows[2].Cells[1];
 
            comboCell.Items.AddRange(new string[] { "VS2003", "VS2005", "MSDN", "RSDN" });
        }
    }
}
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.11.2011, 19:23
Ответы с готовыми решениями:

Получение данных с программно созданных элементов
Программно создаю DataGridView И загружаю в него данные из базы данных. Вопрос: Как теперь...

Получение данных от созданных кодом элементов
Здравствуйте. Имеется код. который создаёт checkBox-ы. Как получить результат, если пользователь...

Получение данных из программно созданных контролов
1. Получаю запросом из БД в дататейбл данные: &quot;наименование&quot;, &quot;тип контрола&quot;, &quot;Значение&quot; 2. В...

Получение данных из динамически созданных edit ов
суть промблемы такая, создаю по нажатию кнопки этид поле, сколько нажму столько и создам, на поле...

26
T34
27.11.2011, 20:51 2
Не понятно в чем вопрос? А что _grid в программе не доступен? Или хотите из внешнего класса? тогда стоит объявить его public наверное...
cool999
28.11.2011, 05:41 3
C#
1
2
3
4
5
public partial class Form1 : Form
    {
        DataGridView _grid;
        public Form1()
        {
Если объявлять так он пишет ошибку
"Ссылка на объект не указывает на экземпляр объекта."
А если при загрузке формы то от не доступен
Вообще я хочу создавать несколько DataGridView и получать с них данные
T34
28.11.2011, 09:37 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 public partial class Form1 : Form
  {
    private DataGridView _grid;
    private DataGridViewTextBoxColumn _colum;
 
    public Form1()
    {
      InitializeComponent();
      _grid = new DataGridView();
      _colum = new System.Windows.Forms.DataGridViewTextBoxColumn();
      ((System.ComponentModel.ISupportInitialize)(_grid)).BeginInit();
 
      _grid.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
      _grid.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
            this._colum});
      _grid.Location = new System.Drawing.Point(33, 143);
      _grid.Name = "_grid";
      _grid.Size = new System.Drawing.Size(181, 82);
      _grid.TabIndex = 1;
      // 
      // Column1
      // 
      _colum.HeaderText = "Column1";
      _colum.Name = "Column1";
 
      _grid.RowCount = 2;
      _grid.Rows[0].Cells[0].Value = "Test";
 
      this.Controls.Add(_grid);
      ((System.ComponentModel.ISupportInitialize)(_grid)).EndInit();
    }
 
    private void button1_Click(object sender, EventArgs e)
    {
      MessageBox.Show(_grid.Rows[0].Cells[0].Value.ToString());
    }
  }
Форма с 1 кнопкой. НА ней программно делается ДатаГид.

Обратите внимания на следующее.

C#
1
this.Controls.Add(_grid);
надо добавить компонент на форму иначе его не будет видно

второй момент если нажать кнопку без строчки
C#
1
_grid.Rows[0].Cells[0].Value = "Test";
выдаст сообщение "В экземпляре объекта не задана ссылка на объект". Это связано с тем что пока в ячейку не поместят значение, ячейки как бы не существует и попытка в нее обратится ведет к ошибке. Я так себе это объясняю... Если же в ячейку что-то записать то все работает. Записывать может и пользователь и программа. Как то так...
cool999
28.11.2011, 18:52 5
С получением данных все получилось только теперь возникла другая проблема если я этим кодом создаю более одного DataGridView то программа работает только с последним экземпляром возможно ли обратится к предыдущим? или это как-то по другому реализовать надо?
вот код. На форме есть tabControl на нем программно создается Panel в ней уже DataGridView
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
private DataGridView d;
.....
 
public void tabel2()
        {
            Panel p = new Panel();
            TabPage t = new TabPage("1111");
            d = new DataGridView();
            p.Parent = t;
            p.Dock = DockStyle.Fill;
            d.Parent = p;
            d.Dock = DockStyle.Fill;
            d.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            d.AllowUserToAddRows = false;
            d.AllowUserToDeleteRows = false;
            d.ReadOnly = true;
            d.AllowUserToOrderColumns = true;
            d.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            tabControl1.TabPages.Add(t);
            d.DataSource = sel("SELECT * FROM C_CLIENTS WHERE NAME LIKE '%" + NameSel.Text + "%'");
 
            
        }
 
 
private void button4_Click(object sender, EventArgs e)
        {
 
            tabel2();
 
            
 
        }
T34
28.11.2011, 19:45 6
по моему вы усложняете
DataGridView d1;
DataGridView d2;
... и так далее..
DataGridView []GridsArray;

GridsArray = new DataGridView[10];
GridsArray[0] = new DataGridView();
...
GridsArray[9] = new DataGridView();

ну и не забывайте им всем делать свои объекты колонки и свои имена давать...
ну и в разные места формы класть если вы их показываете
cool999
28.11.2011, 20:02 7
Я хочу попробовать загружать меню из базы данных привязывать к меню таблицы из этой базы и чтоб все это работало динамически без перекомпиляции приложения.
T34
29.11.2011, 02:05 8
и что вас останавливает?

Вам надо использовать ArrayList

C#
1
2
3
4
ArrayList myAL = new ArrayList();
      myAL.Add("Hello");
      myAL.Add("World");
      myAL.Add("!");
Это встроенный связанный список, который можно набивать любыми элементами (в примере строками, но можно чем хош).
Следовательно вам останется только создавать ДатаГриды, и добавлять их в список, и они все будут доступны, и тд и тп.

только у меня есть вопрос зачем так сложно? Это же интерфейсный элемент, он нужен если вы хотите его показывать, а если для хранения данных то лучше сделать маленький классик который будет все хранить...
cool999
29.11.2011, 05:09 9
попросили сделать базу в которой возможно придется менять поля (удалять или добавлять новые)
Чтоб каждый раз не компилировать приложение хочу сделать так. и вообще потом на будущее пригодится.
T34
29.11.2011, 09:30 10
Это я понял, это стандартное поведение баз данных. Но причем тут DataGridView не понятно.
cool999
29.11.2011, 17:46 11
Цитата Сообщение от T34 Посмотреть сообщение
Это я понял, это стандартное поведение баз данных. Но причем тут DataGridView не понятно.
Чтоб допустим одновременно работать с двумя и более таблицами
Может быть я просто не так себе это представляю. Как вообще в таких случаях поступают?
T34
29.11.2011, 19:52 12
Ну например пишут свои таблицы. Или берут DataGrid вместо DataGridView последний сделан для отображения таблицы и управления ей пользователем.

Программу стоит разделит на 2 части, Интерфейс - которая общается с пользователем. И обработку которая делает выборку данных и общение с базами данных.

Интерфейс надо продумывать. Если пользователь должен уметь запрашивать таблицы, и ни размер ни количество их не известно. Я бы сделал много оконный интерфейс. Взял бы форму, положил на нее ДатаГридВью настроил все силами визуальной среды. И сделал бы эту форму базовым элементом. Каждый раз когда пользователь хочет получить какую либо таблицу, я бы создавал эту форму целиком, и передавал бы в нее данные. Это удобнее надежнее и понятнее чем создавать где то в недрах датагридвью и потом либо его не показывать, либо пытаться найти на форме место куда его влепить.

Элементы отображения должны отображать а не хранить. Для хранения есть другие элементы!
T34
30.11.2011, 01:44 13
Обманул вас DataGrid - просто устаревшая версия DataGridView, для внутреннего хранения и обработки без отображения ArayList надо использовать.
cool999
30.11.2011, 03:21 14
Цитата Сообщение от T34 Посмотреть сообщение
Взял бы форму, положил на нее ДатаГридВью настроил все силами визуальной среды.
У меня так не получится я подключаюсь к fireberd используя библиотеку там только программным способом. А вообще примеры на С# таких баз данных есть?
T34
30.11.2011, 09:34 15
Вы путаете теплое с мягким%)...

когда в визуальной среде вы настраиваете дата грид, она просто всю работу по прописыванию элементов и так далее делает сама, но это же не означает что кода не появляется... А вот когда у вас есть уже настроенный элемент на форме, его можно вместе с формой скопировать, просто нажав Form N1=new Form();
Form N2=new Form();

и если в эту форму добавить еще метод получения данных из таблицы в дата грид, или соединения датагрида с таблицей БД, не важно
то останеться только вызвать этот метод
Form N1=new Form();
Form N2=new Form();
N1.GetData(,...);
N1.GetData(,...);
N1.Show();
N2.Show();

а как вы хотели показывать таблицы? ну сделаете их, ну запихаете в них БД а дальше? На 1 форме размещать? а если их 10 будет?
cool999
23.12.2011, 18:06 16
А если их будет 10 я буду переключатся по вкладкам которые тоже будут создаваться. Как к примеру в 1с когда открываете несколько таблиц и появляются вкладки
cool999
23.12.2011, 18:59 17
Наверное с копированием формы будет проще. Надо только подумать как создавать закладки чтоб переключатся между формами
cool999
23.12.2011, 19:23 18
C#
1
2
3
4
5
6
7
8
private void button4_Click(object sender, EventArgs e)
        {
            Form N1=new Form();
 
            N1.GetData(Form1);
            N1.Show();
 
        }
Попытался копировать начало ругаться на "GetData"
T34
24.12.2011, 00:53 19
ваще не мудрено, я тоже бы ругался%) откуда в форме взялся такой метод?
А даже если бы он был, то скорее всего он бы возвращал данные формы и не принимал бы в качестве аргумента другую форму...

вообщем это не логично)... а далее если вы обратитесь к конструкторам формы, то не увидите в них конструктора копировщика (принимающего тот же класс на входе) а без этого невозможно сделать копирование...

вообщем форму надо делать заново руками, или писать свой класс унаследованный от формы, с добавленным методом копирования. Хотя вряд ли что выйдет, половина данных приватны или защищены, вы их никогда не получите из другой формы..
T34
24.12.2011, 01:14 20
прочитал сообщения до. Хм...! Немного не правильная концепция, зачем копировать форму?

Надо сделать форму, сделать метод отображения таблицы, и давать форме таблицу для отображения.
Если надо показать таблицу, надо создать новый экземпляр формы, а не копировать существующую...

ща попробую схематично обозначит демо проект!.


сделайте проект виндоус апликатион. Добавьте в него новую форму Project-Add windows form

пусть это будет например абоут бокс! AboutBox1

На новой форме положите текст бокс, и создайте метод
C#
1
2
3
4
void SetData(string Data)
{
TextBox1.Text = Data;
}
на основной форме сделайте текст бокс и кнопку, на нажатие кнопки повесьте

C#
1
2
3
AboutBox1 Ab = new AboutBox1();
Ab.SetData(TextBox1.Text);
Ab.Show();
потом запустите проект пишите в текст бокс данные и жмите кнопку, с каждым нажатием у вас будет появляться форма с заданными данными.

Это то что вам надо сделать. Форма - отображает таблицу, в ней есть метод заполнения таблицы, и вы просто делаете новые экземпляры класса формы, и даете ей таблицы для отображения (редактирования если хотите). Каждый созданный экземпляр можно добавлять в общий массив форм, если хотите иметь к ним доступ из главной формы всегда, но это не обязательно... С# хорошо сам чистить память.
24.12.2011, 01:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.12.2011, 01:14
Помогаю со студенческими работами здесь

Событие MouseClick для программно созданных элементов
Программно создал 62 picturebox'ов. Нужно обрабатывать событие л клика мыши по-каждому из них. Но...

Получение значений(Text) из динамически созданных элементов(Edit)
Добрый день! Описание программы Есть одна проблемка. Есть Form1 на ней Button1 при нажатии на...

Изменение программно созданных TextBox по событию программно созданного CheckBox
Помогите пожалуйста! мне нужно разрешить изменение полей всех TextBox и разрешить нажимать на...

Можно ли обеспечить взаимодействие программно созданных объектов и объектов, созданных мастером
Здравствуйте. Изучаю C# и ADO.NET и столкнулся с одной серьезной проблемой, которая мешает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru