Вопрос:
У меня есть 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 “общедоступным” или “внутренним”. Выберите публикацию, если вы новичок, как будто это звучит.