доступ к datagrid из другой формы

Вопрос: У меня есть datagridview в форме1. Как я могу получить доступ к datagridview из формы2. private void button1_Click(object sender, EventArgs e) { string sql1 = "insert into Car (plate, color, [year], model) values ('"+tplate.Text+"','"+tcolor.Text+"',"+tyear.Text+",'"+tmodel.Text+"')"; string sql2 = "select * from Car"; try { int res = CarDatabase.executeOthers(sql1); if(res >0){ DataTable dt = CarDatabase.executeSelect(sql2); mainframe.Dgv.DataSource

Вопрос:

У меня есть datagridview в форме1. Как я могу получить доступ к datagridview из формы2.

private void button1_Click(object sender, EventArgs e) { string sql1 = «insert into Car (plate, color, [year], model) values (‘»+tplate.Text+»‘,'»+tcolor.Text+»‘,»+tyear.Text+»,'»+tmodel.Text+»‘)»; string sql2 = «select * from Car»; try { int res = CarDatabase.executeOthers(sql1); if(res >0){ DataTable dt = CarDatabase.executeSelect(sql2); mainframe.Dgv.DataSource = dt; MessageBox.Show(«New Car is added»); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }

здесь mainframe.Dgv находится в первом виде

но я не могу получить доступ к этому Form1.dataGridView, почему: S

Лучший ответ:

В форме 2:

public DataGridView Dgv { get; set; }

В Форме 1:

Form2 f = new Form2(); f.Dgv = mainframe.Dgv;

В Form2 доступ к собственной Dgv propety.

Ответ №1

Вам нужна ссылка на фактическую Form для доступа к ее членам. (И эти члены должны быть public.)

Просто называя что-то вроде этого:

Form1.dataGridView

не будет работать, потому что Form1 – это просто тип, это не ссылка на экземпляр объекта в памяти. То, как вы ссылаетесь на static члены, что здесь не так. DataGridView является членом экземпляра. Поэтому вам нужна ссылка на экземпляр Form1. Что-то более похожее:

firstForm.dgv

где firstForm является переменной в Form2 (или передается в метод как аргумент из Form1, где аргумент будет именно this и т.д.), а dgv является публичным членом в Form1 который представляет DataGridView.

Что-то вроде этого:

public class Form1 { public DataGridView DGV { get; set; } private void DoSomething() { var anotherForm = new Form2(); anotherForm.DoSomethingElse(this); } } public class Form2 { public void DoSomethingElse(Form1 firstForm) { var data = firstForm.DGV.DataSource; } }

Заметьте, что я оставил здесь много WinForms. Это намеренно. Это просто, чтобы продемонстрировать концепцию на уровне кода. На что наследуются формы, как они создаются, как они хранятся в памяти, и что все остальные проблемы.

Как вы это делаете, зависит от вас. Я не очень хорошо разбираюсь в разработке WinForms, но я думаю, что есть лучшие способы для этого. Чтобы определить это, нам нужно знать, почему Form2 должен получить доступ к Form1 DataGridView. Скорее всего, они должны получить доступ к общему ресурсу. Может быть, что-то вроде этого:

public class Form1 { private DataGridView dgv { get; set; } private void LoadMyData() { dgv.DataSource = GlobalDataSources.SomeDataSource; } private void DoSomething() { var anotherForm = new Form2(); anotherForm.DoSomethingElse(); } } public class Form2 { public void DoSomethingElse() { var data = GlobalDataSources.SomeDataSource; } } public class GlobalDataSources { private static SomeDataSourceType _someDataSource; public static SomeDataSourceType SomeDataSource { get { if (_someDataSource == null) { // populate the data source } return _someDataSource; } } }

Как всегда, есть много способов сделать это. Но основная идея заключается в том, что вместо того, чтобы обращаться друг к другу и создавать все виды кросс-зависимостей, ваши интерфейсные формы получают доступ к общим ресурсам back-end, а цепочка зависимостей просто течет в одном направлении.

Ответ №2

Вам нужно сделать поле/свойство dataGridView “общедоступным” или “внутренним”. Выберите публикацию, если вы новичок, как будто это звучит.

Оцените статью
Добавить комментарий