C#在从另一个类调用方法后设置Form Parent

本文关键字:设置 Form Parent 方法 调用 另一个 | 更新日期: 2023-09-27 17:59:13

我在谷歌上搜索了一整天,找不到问题的正确答案,希望这里有人能帮助我。

因此,在"Main"表单中,我有一个方法来显示一个需要直接位于父表单(frmMain)上方的表单。通常我会调用ShowDialog(this)来查看父级,但出于某种原因,我必须将loadNewsFeedItem设置为static,以便从flpNewsFeedHeader:Label derried类(如下)中查看方法。OnClick事件触发方法loadNewsFeedItem()。

当我调用它来设置父项时,我会收到消息"关键字"this"在静态属性、静态方法或静态字段初始值设定项中无效"

namespace NewsFeeds
{
public partial class FrmMain : Form
{
    public static void loadNewsFeedItem()
    {
        frmNewsFeedView frmFeedView = new frmNewsFeedView(FrmFuncs.selFeedID);
        frmFeedView.ShowDialog(this); // Error occurs on this line, when calling this via a static method
    }
}
}
public class flpNewsFeedHeader : Label
{
 private int FeedID = 0;
 public int theFeedID
 {
     get { return FeedID; }
     set { FeedID = value; }
 }
 protected override void OnClick(EventArgs e)
 {
     FrmFuncs.selFeedID = FeedID;
     Thread thrShowFeed = new Thread(new ThreadStart(FrmMain.loadNewsFeedItem));
     thrShowFeed.Start();
 }
}

请有人给我一个更正的代码示例或提示,告诉我如何在不将访问器设置为静态的情况下使loadNewsFeedItem()可见,或者如何在静态访问器中解决这个问题?

提前感谢!

Chris

C#在从另一个类调用方法后设置Form Parent

编辑:使用ActiveForm作为所有者。
   public partial class FrmMain : Form
   {
      public static void loadNewsFeedItem(Form owner)
      {
         frmNewsFeedView frmFeedView = new frmNewsFeedView(FrmFuncs.selFeedID);
         frmFeedView.ShowDialog(owner);
      }
   }
}
public class flpNewsFeedHeader : Label
{
   private int FeedID = 0;
   public int theFeedID
   {
      get { return FeedID; }
      set { FeedID = value; }
   }
   protected override void OnClick(EventArgs e)
   {
      FrmFuncs.selFeedID = FeedID;
      // Shouldn't need a new thread.  Already on the GUI thread.
      FrmMain.loadNewsFeedItem (System.Windows.Forms.Form.ActiveForm);
   }
} 

你的意思可能是:

frmFeedView.Owner = System.Windows.Forms.Form.ActiveForm;
frmFeedView.ShowDialog();

在静态方法中,this是没有意义的。一种选择是跳过参数

frmFeedView.ShowDialog();

另一种选择是设置一个静态变量,如下所示(但要注意,如果你试图打开FrmMain的多个实例,它可能会产生副作用)

public partial class FrmMain : Form
{
    private static FrmMain staticInstance;
    public FrmMain()
    {
       staticInstance = this;
       InitializeComponent();
       ...
    }
    public static void loadNewsFeedItem()
    {
        frmNewsFeedView frmFeedView = new frmNewsFeedView(FrmFuncs.selFeedID);
        frmFeedView.ShowDialog(staticInstance ); 
    }