繁体   English   中英

C#将控件从静态类添加到非静态形式

[英]C# Adding controls to a non-static form from a static class

在C#.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方法代表Windows窗体,称为“ GUI”。 我正在尝试制作一个开放源媒体中心,该中心允许您将电影添加到存储库中。

由于AddMediaToPanel ,静态的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);
   }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM