从静态类向非静态表单添加控件

本文关键字:表单 添加 控件 静态 静态类 | 更新日期: 2023-09-27 18:13:06

. NET,我正试图将控件从静态类添加到非静态类。

这是我的代码:

    public static void AddMediaToPanel(string Title, string Description, string Source, string Cover, string Genre, int Rating)
    {
        PictureBox MediaCanvas = new PictureBox();
        MediaCanvas.BackColor = Color.LightGray;
        MediaCanvas.BorderStyle = BorderStyle.FixedSingle;
        MediaCanvas.Size = new Size(150, 235);
        MediaCanvas.Padding = new Padding(10);
        try
        {
            MediaCanvas.ImageLocation = Source;
        }
        catch { }
        var gui = new GUI();
        gui.Controls.Add(MediaCanvas);
    }

GUI方法代表一个称为"GUI"的Windows窗体。我想做一个开源媒体中心,让你可以添加电影到存储库。

静态void AddMediaToPanel必须是静态的,因为这个类:

    public static void RetrieveMedia(string XMLFile)
    {
        // Declare the Media Collections
        MediaCollection media = null;
        // Declare the XML-readers
        XmlSerializer serializer = new XmlSerializer(typeof(MediaCollection));
        StreamReader sr = new StreamReader(XMLFile);
        try
        {
            media = (MediaCollection)serializer.Deserialize(sr);
        }
        catch(Exception ex)
        {
            MessageBox.Show("The following media repository could not be loaded:'n" +
                            XMLFile + "'n" +
                            "Please check your code and try again later.'n'n" +
                            "Error Information: " + ex.Message, "Repository error",
                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        // Create new instance of the media class
        sr.Close();
        // Return properties
        try
        {
            foreach (Video video in media.Video)
            {
                GUI.AddMediaToPanel(video.Title, video.Description, video.Source, video.Cover, video.Genre, video.Rating);
            }
        }
        catch { }
    }

我正在使用。net Framework 4.5.2。提前感谢!

~ Kees van V.

从静态类向非静态表单添加控件

不能这样工作。在循环中调用静态方法:

foreach (Video video in media.Video)
{
    GUI.AddMediaToPanel(video.Title, video.Description, video.Source, video.Cover, video.Genre, video.Rating);
}

但是你的静态方法每次都创建一个新的Form,给它添加一个控件,然后把它扔掉:

var gui = new GUI();
gui.Controls.Add(MediaCanvas);

你需要创建你的表单一次(在你的静态方法之外),然后有你的静态方法返回一个控件,你可以添加到你的单个Form实例。

带有循环的实例方法如下:

var gui = new GUI();
foreach (Video video in media.Video)
{
     var control = GUI.AddMediaToPanel(video.Title, video.Description, video.Source, video.Cover, video.Genre, video.Rating);
     gui.Controls.Add(control);
}

在您当前的代码中,您只是创建并丢弃gui表单:

   var gui = new GUI();
   gui.Controls.Add(MediaCanvas);

你必须找到你想要添加控件的表单实例:

   public static GUI CurrentGui {
     get {
       GUI gui = Application
        .OpenForms
        .OfType<GUI>()
        .LastOrDefault();
       // no such form found, you may want to create the form 
       if (null == gui) {
         gui = new GUI();
         gui.Show(); // <- let's show it up
       }
       return gui;
     }
   } 
   ...      
   public static void AddMediaToPanel(...) {
     ...
     CurrentGui.Add(MediaCanvas);
   }