Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/25: Рейтинг темы: голосов - 25, средняя оценка - 4.80
cool999

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

27.11.2011, 19:23. Показов 4553. Ответов 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" });
        }
    }
}
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.11.2011, 19:23
Ответы с готовыми решениями:

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

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

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

26
T34
27.11.2011, 20:51
Не понятно в чем вопрос? А что _grid в программе не доступен? Или хотите из внешнего класса? тогда стоит объявить его public наверное...
cool999
28.11.2011, 05:41
C# Скопировано
1
2
3
4
5
public partial class Form1 : Form
    {
        DataGridView _grid;
        public Form1()
        {
Если объявлять так он пишет ошибку
"Ссылка на объект не указывает на экземпляр объекта."
А если при загрузке формы то от не доступен
Вообще я хочу создавать несколько DataGridView и получать с них данные
T34
28.11.2011, 09:37
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
С получением данных все получилось только теперь возникла другая проблема если я этим кодом создаю более одного 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
по моему вы усложняете
DataGridView d1;
DataGridView d2;
... и так далее..
DataGridView []GridsArray;

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

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

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

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

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

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

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

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

когда в визуальной среде вы настраиваете дата грид, она просто всю работу по прописыванию элементов и так далее делает сама, но это же не означает что кода не появляется... А вот когда у вас есть уже настроенный элемент на форме, его можно вместе с формой скопировать, просто нажав 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
А если их будет 10 я буду переключатся по вкладкам которые тоже будут создаваться. Как к примеру в 1с когда открываете несколько таблиц и появляются вкладки
cool999
23.12.2011, 18:59
Наверное с копированием формы будет проще. Надо только подумать как создавать закладки чтоб переключатся между формами
cool999
23.12.2011, 19:23
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
ваще не мудрено, я тоже бы ругался%) откуда в форме взялся такой метод?
А даже если бы он был, то скорее всего он бы возвращал данные формы и не принимал бы в качестве аргумента другую форму...

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

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

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

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


сделайте проект виндоус апликатион. Добавьте в него новую форму 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();
потом запустите проект пишите в текст бокс данные и жмите кнопку, с каждым нажатием у вас будет появляться форма с заданными данными.

Это то что вам надо сделать. Форма - отображает таблицу, в ней есть метод заполнения таблицы, и вы просто делаете новые экземпляры класса формы, и даете ей таблицы для отображения (редактирования если хотите). Каждый созданный экземпляр можно добавлять в общий массив форм, если хотите иметь к ним доступ из главной формы всегда, но это не обязательно... С# хорошо сам чистить память.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2011, 01:14
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Работа с объемным DOM в javascript
Htext 04.04.2025
Сегодня прочитал статью тут о расходах памяти в JS, ее утечках и т. п. И вот что вспомнил из своей недавней практики. Может, кому пригодится. Хотя, в той статье об этом тоже есть. Дело в том, что я. . .
Оптимизация производительности Node.js с помощью кластеризации
run.dev 04.04.2025
Масштабирование приложений для обработки тысяч и миллионов запросов — обыденная задача для многих команд. Node. js, благодаря своей асинхронной событийно-ориентированной архитектуре, стал популярной. . .
Управление зависимостями в Python с Poetry
py-thonny 04.04.2025
Стандартный инструмент для установки пакетов в Python - pip - прекрасно справляется с базовыми сценариями: установил пакет командой pip install и используешь его. Но что произойдёт, когда разные. . .
Мониторинг с Prometheus в PHP
Jason-Webb 04.04.2025
Prometheus выделяется среди других систем мониторинга своим подходом к сбору и хранению метрик. В отличие от New Relic, который использует агентный подход и отправляет данные во внешнее хранилище,. . .
Пакет Context в Golang: Управление потоками и ресурсами
golander 04.04.2025
Работа с горутинами в Go часто напоминает управление непослушными детьми - они разбегаются кто куда, делают что хотят и не всегда завершаются вовремя. К счастью, в Go 1. 7 появился пакет context,. . .
Контейнеризация React приложений с Docker
Reangularity 03.04.2025
Контейнеризация позволяет упаковать приложение со всеми его зависимостями в автономный контейнер, который можно запустить на любой платформе с установленным Docker. Это существенно упрощает процессы. . .
Свой попап в SwiftUI
mobDevWorks 03.04.2025
SwiftUI, как декларативный фреймворк от Apple, предоставляет множество инструментов для создания пользовательских интерфейсов. В нашем распоряжении есть такие API как alerts, popovers, action sheets. . .
Антипаттерны микросервисной архитектуры
ArchitectMsa 03.04.2025
Хорошо спроектированная микросервисная система может выдержать испытание временем, оставаясь гибкой, масштабируемой и устойчивой к большинству проблем. Такая архитектура обладает высоким уровнем. . .
std::mutex в C++: Советы и примеры использования
bytestream 03.04.2025
std::mutex - это механизм взаимного исключения, который гарантирует, что критический участок кода выполняется только одним потоком в каждый момент времени. Это простое, но могущественное средство. . .
Не удержался от оценки концепции двигателя Стирлинга.
Hrethgir 03.04.2025
Сколько не пытался - она выдавала правильные схемы, причём случайно рисовала горячие области в середине, холодные по краям, трубки с краёв в низ и магнит в соединяющей, но при этой выдавала описание. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер