вызов переменной из другой формы C#

#c# #winforms

#c# #winforms

Вопрос:

У меня есть DataGridView in Form1 , и я использую этот код для отображения другой формы с именем Generator :

 private void button1_Click(object sender, EventArgs e)
{
   Form gen = new Generator();
   // Form gen = new Generator(Form this); //* I tried this but is not working *//
   gen.Show();
}
  

В Generator форме мне нужно прочитать или изменить что-то в datagridview, который находится в Form1 .

 public partial class Generator : Form
{
   public Form myForm;

   public Generator()
   {
      InitializeComponent();
   }

   public Generator(Form frm)
   {
      myForm = frm;
   }

   private void button1_Click(object sender, EventArgs e)
   {
      myForm.mydatagridview.! // this is not working
   }
}
  

Как я могу решить эту проблему, чтобы я мог манипулировать DataGridView из Generator формы?

Комментарии:

1. какой тип myForm в генераторе? Пусть это будет тип Form1

Ответ №1:

Форма 1:

 private void button1_Click(object sender, EventArgs e)
{
    Form gen = new Generator(this.mydatagridview);
    gen.Show();
}
  

Форма генератора:

 DataGridView _dataGridView;
public Generator(DataGridView dataGridView)
{
    InitializeComponent();
    this._dataGridView = dataGridView;
}

private void button1_Click(object sender, EventArgs e)
{
    this._dataGridView...! // this will work
}
  

Что вы должны делать и знать (просто советы, вас не заставляют это делать, но я верю, что вы станете лучшим программистом, если будете это делать! 😉

Всегда вызывайте InitializeComponent() во всех конструкторах формы. В вашем примере вы не вызвали ее ни в одном из конструкторов.

C # знает только информацию того типа, который вы передали. Если вы передаете форму, то вы получаете только свойства формы (то есть свойства типа Form), а не свойства вашей собственной формы.

Попробуйте инкапсулировать вещи. Не передавайте целую форму в другую форму. Вместо этого передайте то, что вы хотели бы использовать в другой форме.

Комментарии:

1. очень скромный парень и мудрый совет

2. Приятно «слышать» это … спасибо! Я просто человек, пытающийся быть хорошим.

Ответ №2:

Здесь происходит несколько вещей.

  1. Вы должны использовать конструктор Generator , который принимает форму в качестве параметра.
  2. Вы должны предоставить datagridview как общедоступное или внутреннее свойство в форме, которую вы передадите в генератор.
  3. Обычный Form класс не будет знать об этом свойстве, поэтому вы должны привести переменную соответствующим образом.
  4. Вы должны вызвать конструктор Generator по умолчанию, когда используется другой конструктор, чтобы убедиться, что все инициализировано правильно. Смотрите пример кода ниже.

Что-то вроде этого должно сработать:

 public class Generator
{
    private MyForm myForm;

    public Generator()
    {
        InitializeComponent();
    }

    public Generator(MyForm frm) : this() // DON'T FORGET THIS()
    {
        myForm = frm;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        myForm.MyDataGridView... // Yay, it works!
    }
}

public class MyForm : Form
{
    public MyForm()
    {
        InitializeComponent(); // a datagridview is created here, say "datagridview1"
    }

    public DataGridView MyDataGridView
    {
        get { return datagridview1; }
    }
}
  

И затем в вашем событии нажатия кнопки (которое, я полагаю, определено где-то в MyForm ):

 private void button1_Click(object sender, EventArgs e)
{
    Form gen = new Generator(this);
    gen.Show();
}
  

Ответ №3:

Самый простой способ оттуда — открыть конструктор для DataGridView (myDataGridView) в Form1 и установить свойство Modifiers с private на internal или public

Это позволит вам вызывать myForm.myDataGridView из формы генератора.