#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:
Здесь происходит несколько вещей.
- Вы должны использовать конструктор
Generator
, который принимает форму в качестве параметра. - Вы должны предоставить datagridview как общедоступное или внутреннее свойство в форме, которую вы передадите в генератор.
- Обычный
Form
класс не будет знать об этом свойстве, поэтому вы должны привести переменную соответствующим образом. - Вы должны вызвать конструктор 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
из формы генератора.