Вам нужна ссылка на фактический 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, а цепочка зависимостей просто течет в одном направлении.
Есть ли у Form1 ссылка на Form2? Если нет, не так ли? Если нет, имеет ли какая-либо другая форма или объект ссылки на Form1 и Form2? – Nick
как я могу это сделать? – snnlaynnkrdsm
В моем примере у меня две формы. В примере выше из сети. Как я могу получить доступ к datagridview в form1 из формы2: S – snnlaynnkrdsm