2011-12-21 4 views
0

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

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

+1

Есть ли у Form1 ссылка на Form2? Если нет, не так ли? Если нет, имеет ли какая-либо другая форма или объект ссылки на Form1 и Form2? – Nick

+0

как я могу это сделать? – snnlaynnkrdsm

+0

В моем примере у меня две формы. В примере выше из сети. Как я могу получить доступ к datagridview в form1 из формы2: S – snnlaynnkrdsm

ответ

2

В Form2:

public DataGridView Dgv { get; set; } 

В Form1:

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

В доступе Form2 свой собственный DGV propety.

3

Вам нужна ссылка на фактический 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 должен получить Form1DataGridView. Скорее всего, они должны получить доступ к общему ресурсу. Возможно, что-то еще вот так:

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, а цепочка зависимостей просто течет в одном направлении.

0

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

Смежные вопросы