sv sathish Ответов: 3

Как добавить форму в панель из другой формы


Всем Привет...

Я делаю простой проект на c#, я хочу отобразить форму в одной панели, формы добавили эту панель также из другой формы.В этом состоянии в VB.net тогда код очень прост

Public Class Form2

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Form3.TopLevel = False
        Form3.TopMost = True
        Form1.Panel1.Controls.Add(Form3)
        Form3.Show()
    End Sub
End Class


Но в c# это не так просто,я знаю, как добавить элементы управления в панель из той же формы, но я новичок в этом случае, поэтому, пожалуйста, помогите мне, как добавить форму в панель из другой формы в приложении C# Windows.

3 Ответов

Рейтинг:
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

Я не думаю, что он нас слушает... :вздох: