Попытка сгенерировать кнопки на C#

#c# #winforms #user-interface #button

#c# #winforms #пользовательский интерфейс #кнопка

Вопрос:

Недавно я изучал WinForms и нашел пару руководств, которые демонстрируют, как генерировать кнопки. Однако, хотя это явно работает в видеороликах, которые я смотрю, я не вижу, чтобы кнопки появлялись при загрузке формы. Мне интересно, есть ли что-то очевидное, чего мне не хватает.


  private void Form1_Load(object sender, EventArgs e)
        {
            Button btn = new Button();
            btn.Text = "Connect";
            btn.Name = "Connect";
            btn.Size = new Size(140, 23);
            btn.Location = new Point(0, 137);
            btn.Click  = (obj, eArgs) =>
            {

            };
            this.Controls.Add(btn);
            Button btn2 = new Button();
            btn2.Text = "Clear";
            btn2.Name = "Clear";
            btn2.Size = new Size(140, 23);
            btn2.Location = new Point(0, 160);
            btn2.Click  = (obj, eArgs) =>
            {

            };
            this.Controls.Add(btn2);


        }
  

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

1. Вы привязали форму. Событие загрузки?. Привязать событие загрузки формы к конструктору.. это. Загрузка = новая система. Обработчик событий(this. Form1_Load);

Ответ №1:

Вы уверены, что расположение кнопки находится в пределах видимости окна?

Что произойдет, если вы добавите эти утверждения:

 Debug.Assert(this.button1.Location.X   this.button1.Size.Height < this.Height);
Debug.Assert(this.button1.Location.Y   this.button1.Size.Width < this.Width);
  

Я попробовал следующий минимальный код, и кнопка появилась в позиции 0,0

 private void button1_Click(object sender, EventArgs e)
{
    var button = new System.Windows.Forms.Button();
    this.Controls.Add(button);
}
  

Если вы используете проект Visual Studio forms, обычно проще использовать конструктор для добавления ваших кнопок. Просто перетащите кнопку из панели инструментов примерно в то место, которое вы хотите. Используйте окно свойств, чтобы изменить значения свойств.

 public partial class Form1 : Form
{
    public Form1()
    {
        this.InitializeComponent();
    }
}
  

Если вы посмотрите в InitializeComponent, вы найдете код, похожий на ваш:

 private System.Windows.Forms.Button button1;

private void InitializeComponent()
{
    this.button1 = new System.Windows.Forms.Button();

    this.SuspendLayout();
    // 
    // button1
    // 
    this.button1.Location = new System.Drawing.Point(58, 58);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(75, 23);
    this.button1.TabIndex = 0;
    this.button1.Text = "button1";
    this.button1.UseVisualStyleBackColor = true;

    this.Controls.Add(this.button1);
  

Единственными отличиями являются UseVisualStyleBackColor и добавленное свойство. Но моя программа вверху показывает, что они для этого не нужны.

Кстати, помимо использования конструктора для создания ваших кнопок, обычно лучше создавать все компоненты в конструкторе, даже если вы не хотите показывать их прямо сейчас. Просто установите для свойства Visible значение false.

Если вы создаете все компоненты в конструкторе, вы можете быть уверены, что кнопка существует на протяжении всего срока службы вашего окна. Вам никогда не нужно проверять, было ли уже обработано событие, создающее кнопку (в вашем случае загрузка формы).

Ответ №2:

Эта проблема связана с тем, что вы не зарегистрировались для события Form1_Load. Есть три способа решить эту проблему. Третий метод является наиболее широко используемым.

  1. Вручную зарегистрируйте событие загрузки для формы в Form.cs. Следующим образом:

     public Form1()
      {
          InitializeComponent();
          this.Load =new EventHandler(Form1_Load);
      }
      
  2. Событие загрузки является событием формы по умолчанию. Вы можете напрямую дважды щелкнуть форму. Таким образом, дизайнер автоматически генерирует событие Form_Load без ручной регистрации. Просто добавьте в него свой код.

  3. Кроме того, вы также можете создавать обработчики событий в конструкторе форм Windows. Понимание этой части будет очень полезно для изучения Winform.Создать обработчик событий в конструкторе Windows Forms

здесь