【问题标题】:How do I control multiple user controls with one button in Windows form?如何在 Windows 窗体中通过一个按钮控制多个用户控件?
【发布时间】:2014-12-18 00:41:50
【问题描述】:

我有一个可以动态创建用户控件的表单,每个用户控件都有一个开始按钮和一个停止按钮。有没有办法在表单上设置全部开始和全部停止按钮?

我尝试在单击主窗体按钮时设置一个布尔值,但一旦创建了用户控件,它就不会检查布尔值。

这里是主窗体的代码(vdoPlayer 是用户控件):

namespace AutoPopulateVideoSaving
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            DisplayImage();
        }

        private void DisplayImage()
        {
            int h = 20;

            for (int i = 0; i < 6; i++)
            {
                int w = i % 2;
                vdoPlayer np = new vdoPlayer();

                np.Location = new System.Drawing.Point((33 + 408 * w), h);
                np.Name = "test" + i.ToString();
                np.Size = new System.Drawing.Size(408, 266);
                this.Controls.Add(np);
                h = h + (266 * w);
            }

        }

        private void StartAllBut_Click(object sender, EventArgs e)
        {

        }

        private void StopAllBut_Click(object sender, EventArgs e)
        {

        }    
    }
}

这是用户控件的代码:

namespace AutoPopulateVideoSaving
{
    public partial class vdoPlayer : UserControl
    {

        public vdoPlayer()
        {
            InitializeComponent();
            VariableClass2.InitiateVariables();
            JPEGStream jpegSource1 = new JPEGStream("http:// IP address /jpg/image.jpg?resolution=320x240");
            jpegSource1.Login = username;
            jpegSource1.Password = password;
            jpegSource1.NewFrame += new NewFrameEventHandler(jpegSource1_NewFrame);
            jpegSource1.VideoSourceError += new VideoSourceErrorEventHandler(jpegSource1_VideoSourceError);
            Player1.VideoSource = jpegSource1;
        }

        void jpegSource1_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            Bitmap image = new Bitmap(eventArgs.Frame, 320, 240);
            image.Save(someFile, System.Drawing.Imaging.ImageFormat.Bmp);
        }

        void jpegSource1_VideoSourceError(object sender, VideoSourceErrorEventArgs eventArgs)
        {
            //Error handler
            Debug.WriteLine(eventArgs.Description);
        }

        private void StartBut_Click(object sender, EventArgs e)
        {
            Player1.VideoSource.Start();
        }

        private void StopBut_Click(object sender, EventArgs e)
        {
            Player1.VideoSource.Stop();
        }    
    }
}

我不知道在 Form1 的按钮单击事件中放置什么来控制其余部分。就像我之前说的,我尝试使用布尔值,但它不起作用。这甚至可能吗?

【问题讨论】:

    标签: c# forms user-controls


    【解决方案1】:

    首先,vdoPlayer 需要公开此功能以供其他对象调用。像这样的:

    public void StartVideo()
    {
        Player1.VideoSource.Start();
    }
    
    public void StopVideo()
    {
        Player1.VideoSource.Stop();
    }
    

    (一旦这些都到位,该类的点击处理程序和其他功能应该使用这些方法,而不是直接在 VideoSource 上调用 Start()Stop(),只是为了更简洁的代码。)

    此外,表单应保留所有相关控件的列表。像这样的东西应该可以解决问题:

    public partial class Form1 : Form
    {
    
        private List<vdoPlayer> videoPlayers;
    
        public Form1()
        {
            InitializeComponent();
            videoPlayers = new List<vdoPlayer>();
            DisplayImage();
        }
    
        // etc.
    }
    

    只要动态创建这样的控件,只需将其添加到该列表即可。销毁后,将其从列表中删除。 (您可以跳过显式列表并尝试动态遍历 Controls 集合以动态构建列表,但这会变得非常丑陋。)

    现在您的表单按钮只需要调用视频播放器控件上的操作:

    private void StartAllBut_Click(object sender, EventArgs e)
    {
        foreach (var videoPlayer in videoPlayers)
            videoPlayer.StartVideo();
    }
    
    private void StopAllBut_Click(object sender, EventArgs e)
    {
        foreach (var videoPlayer in videoPlayers)
            videoPlayer.StopVideo();
    }  
    

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多