【问题标题】:VB.Net How to programmatically add a control and an event handlerVB.Net 如何以编程方式添加控件和事件处理程序
【发布时间】:2019-05-24 01:22:12
【问题描述】:

我正在使用 PictureBox 控件创建一个游戏并添加一个 MouseDown 事件来处理减少 PictureBox 的“健康”值。

我想在初始控件失去所有健康时以编程方式添加一个新控件,以便我可以为新 PictureBox 的显示方式添加变化,但我不知道如何向以编程方式创建的控件添加事件处理程序.

更新:感谢您的帮助! 这就是我完成的代码的工作方式,如果你也想这样做的话。

Public Class Form1
    Private Sub NewBug()
        Dim pbBug As New PictureBox With {
        .Name = "pb",
        .Width = 100,
        .Height = 100,
        .Top = 75,
        .Left = 75,
        .SizeMode = PictureBoxSizeMode.Zoom,
        .Image = My.Resources.bug}
        Me.Controls.Add(pbBug)

        AddHandler pbBug.MouseDown, Sub(sender As Object, e As EventArgs)
                                    MessageBox.Show("Hello", "It Worked")
                                End Sub
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        NewBug()
    End Sub

谢谢, SunnyCr

【问题讨论】:

  • 删除Handles MyButton.Click,添加Me.Controls.Add(MyButton)
  • 请注意,在任何事件处理程序中,您都可以使用sender 参数来访问引发事件的对象。这意味着,如果您使用一种方法处理多个对象的事件,则可以确定哪些对象引发了该事件。
  • 以后,你可以像 .Controls.Add 一样向父级添加控件,例如 Me.Controls.Add(Picturebox),而像 add handler object.type 一样添加和删除处理程序,地址方法如addhandler pbBug.MouseDown,TestSub()的地址
  • 您更改了问题的原始内容对我来说很奇怪。这些 cmets 和 answer 现在看起来像孤儿了
  • @Mr.Tripodi,对不起,这是我的第一篇文章。我不太确定我应该如何处理它。

标签: vb.net events controls programmatically


【解决方案1】:

有些东西没有加起来。看起来好像Dim MyButton As New Button() 应该在类范围内声明,您不必在局部变量上声明 WithEvents。此外,如果 MyButton 是本地加载例程,MyButton_Click 子程序将不会编译。如果它是在 Class Scope 中声明的,那么您将使用 WithEvents MyButton As New Button 而不是 WithEvents MyButton As New Button 如果您想将其保留在本地,那么您可以这样做

Dim MyButton As New Button With {
     .Name = "MyButton",
     .Top = 100,
     .Left = 100,
     .Image = My.Resources.SomeImage}

Controls.Add(MyButton)

AddHandler MyButton.Click, Sub(s As Object, ev As EventArgs)
                               'Do stuff
                           End Sub

这通常是我这样做的方式,除非我打算删除处理程序,否则我将创建一个 Sub 并使用 AddressOf ,例如您尝试使用它的方式。

【讨论】:

  • 我最初的例子使用了一个按钮,所以你的也这样做了,但我想将它用于图片框。无论如何,这解决了我的问题,也是我的导师也无法解决的问题;非常感谢您的帮助!
  • @Mr. Tripodi 不应该在添加控件之前添加handler吗?
  • 我个人在加载事件结束时添加所有句柄
  • ^好吧,我应该在他们接受的任何例行程序结束时说
【解决方案2】:

您必须通过代码导入windows.system.Forms来创建一个生成图片框的类;例如,您可以这样做,更改图片框的标签:

这是课程:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    class Etiqueta
    {
        private Label etiquetaHija;

        public Label EtiquetaHija { get => etiquetaHija; set => etiquetaHija = value; }

        public Etiqueta(Point posicion, Size dimensiones, string texto)
        {
            etiquetaHija = new Label();
            etiquetaHija.Size = dimensiones;
            etiquetaHija.Location = posicion;
            etiquetaHija.Text = texto;
            etiquetaHija.Click += EtiquetaHija_Click;
                   }

        private void EtiquetaHija_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Etiqueta Hija");
        }

  
    }
    

这是表单背后的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Etiqueta etiqueta = new Etiqueta(new Point(20, 20), new Size(100, 100), "Ejemplo de creacion de un label por codigo con manejador de eventos");
            this.Controls.Add(etiqueta.EtiquetaHija );
        }
    }
}

 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多