Рейтинг:
23
OriginalGriff
Это очень плохой способ сделать что-то: он будет работать точно так же в C#, как и в VB, но...это не значит, что это хорошее решение.
Если вы переведете свой код на C#, он будет работать:
private void button1_Click(object sender, EventArgs e)
{
frmOther fOther = new frmOther();
fOther.TopLevel = false;
fOther.TopMost = true;
panel1.Controls.Add(fOther);
fOther.Show();
}
Но... ваш код требует, чтобы Form2 знал о Form1 и Form3, что нарушает правила OOPs и связывает формы вместе.
Гораздо, гораздо лучшим решением было бы создать UserControl, который вы добавляете в панель (и в From3, если он должен быть показан независимо), так как это делает вещи более аккуратными. И Form2 вообще не должен иметь доступа к элементам управления Form1! Вместо этого он должен запросить Form1 сделать это сам, или вы в конечном итоге получите любое изменение, которое вы хотите внести в Form1, потенциально нарушая код повсюду!
RhishikeshLathe
спасибо Оригинал Грифф сэр,
здесь я получил новую вещь, чтобы знать.
Ты всегда мне помогаешь,
Большое спасибо.
OriginalGriff
Всегда пожалуйста!
Siva Hyderabad
пишем ли мы хранимую процедуру без ключевых слов "AS" и "BEGIN"? пожалуйста, предложите мне?
OriginalGriff
Какое это имеет отношение к WinForms внутри панелей?
sv sathish
я знаю, как добавить элементы управления в панель в той же форме. мой вопрос заключается в том, как добавить форму в панель из другой формы. Это возможно или нет???
OriginalGriff
Да - но это все равно плохая идея!
Вы вообще пробовали использовать приведенный выше код? Если да, то с какой проблемой вы столкнулись?
sv sathish
хорошо, как получить элементы управления формой из другой формы, отправьте свою хорошую идею.
OriginalGriff
Вы не. Вы просите другую форму сделать это за вас - таким образом, каждая форма знает как можно меньше о другой и может быть изменена, не затрагивая остальную часть системы.
Когда вы создаете экземпляр FormB в FormA и показываете его, FormA должна знать, что FormB существует, но она не хочет знать, как FormB делает вещи. Точно так же forma даже не знает, что FormA существует!
Если FormA хочет добавить FormC в FormB, она просит FormB выполнить эту работу, вызвав метод (или используя свойство) в экземпляре формы - и Forma может сделать это любым способом, включая добавление формы к своим элементам управления, но это не обязательно, при условии, что она выполняет запрошенную работу.
Если FormB хочет сделать то же самое с FormA, он должен вызвать событие, которое FormA может обработать, чтобы FormA знала, что Forma хочет что-то сделать.
Таким образом, Упс удовлетворен, и дальнейшее обслуживание становится намного проще!
Рейтинг:
16
sv sathish
Привет...
Моя проблема решена следующим кодом,ясно мое сомнение, Спасибо за Vulpes.
public class Form2 : Form
{
private void button1_Click(object, EventArgs e)
{
Form3 form3 = new Form3();
form3.TopLevel = false;
form3.TopMost = true;
Form1 form1 = (Form1)Application.OpenForms["Form1"];
Panel panel1 = (Panel)form1.Controls["panel1"];
panel1.Controls.Add(form3);
form3.Show();
}
}
А также выражаю свою благодарность за все комментарии.
Member 14071977
Спасибо, что это сработало для меня.
Рейтинг:
0
BillWoodruff
Чтобы просто описать, что вы делаете в VB: когда кнопка нажата на экземпляре Form2:
1. Возьмите уже существующий экземпляр Form3
2. вставьте этот экземпляр Form3 в элемент управления панели в экземпляре Form1
Это не очень хорошая идея, чтобы поместить форму внутри другой формы или внутри элемента управления в другой форме (если вы не используете старую архитектуру MDI, которую я предлагаю вам избегать). OriginalGriff прав-когда он советует вам использовать элемент управления UserControl !
Чтобы помочь вам лучше понять программирование в WinForms, нам нужно знать, какая форма здесь является "основной": создает ли Form1 Form2 и Form3 ?
Если это так, то мы можем сказать, что ваша цель:
1. чтобы дать экземпляру Form2 способ сообщить Form1, что ему необходимо вставить экземпляр пользовательского интерфейса в панель внутри него.
Итак, мы даем Form1 способ подписаться на событие нажатия кнопки в Form2 следующим образом:
В форме 2: путем создания общедоступной ссылки на свою кнопку:
public partial class Form2 : Form
{
// create a public property of type 'Button
public Button f2Button { set; get; }
public Form2()
{
InitializeComponent();
// set the Property so 'Form1 can see it
f2Button = this.button1;
}
}
В форме 1: подписавшись на событие щелчка кнопки
public partial class Form2 : Form
{
public Form1()
{
InitializeComponent();
}
Form2 f2 = new Form2();
private void Form1_Load(object sender, EventArgs e)
{
// subscribe to Form2's 'button1 Click Event
f2.f2Button.Click += f2Button_Click;
}
private void f2Button_Click(object sender, EventArgs e)
{
// the code to add some UI to the Panel on Form1 goes here
MyUserControl uc = new MyUserControl;
panel1.Controls.Add(uc);
// set position, or Dock, or Anchor of the added UserControl as needed
}
}
Ограничивая то, что Form2 предоставляет другим формам/классам, только своей Кнопкой, мы пытаемся свести "связь" (зависимость) между формами/классами к минимуму.
sv sathish
Вы тестируете этот код?? Ваши комментарии мне не помогли... пожалуйста, опубликуйте любые другие идеи..
OriginalGriff
Я не думаю, что он нас слушает... :вздох: