C # Установить родителя формы после вызова метода из другого класса - PullRequest
2 голосов
/ 15 июня 2011

Я искал в Google весь день и не могу найти правильный ответ на свой вопрос, надеясь, что кто-то здесь может мне помочь.

Итак, в форме "Основной" у меня есть способ показатьформа, которая должна быть в центре непосредственно над родительской формой (frmMain).Обычно я бы вызвал ShowDialog (this), чтобы увидеть родителя, но по какой-то причине я должен установить loadNewsFeedItem в static, чтобы увидеть метод из класса flpNewsFeedHeader: Label derrived (ниже).Событие OnClick вызывает метод loadNewsFeedItem ().

Когда я вызываю это для установки родителя, я получаю сообщение «Ключевое слово« это »недопустимо в статическом свойстве, статическом методе или статическом поле».initializer "

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 () видимым без установки статического метода доступа или как обойти это встатический аксессор?

Заранее спасибо!

Крис

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Редактировать: используется 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);
   }
} 
1 голос
/ 15 июня 2011

может быть, вы имеете в виду это:

frmFeedView.Owner = System.Windows.Forms.Form.ActiveForm;
frmFeedView.ShowDialog();
0 голосов
/ 15 июня 2011

В статическом методе 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 ); 
    }
...