2015-01-07 9 views
5

フォームラベルから継承するユーザーコントロール、MenuItemを作成しました。ユーザーコントロールのメインフォームからプロパティを読み取るにはどうすればいいですか

私は、IsBusyプロパティがMainFormのプロパティを通じてIsBackgroundBusyとして公開されているBackgroundworkerスレッドを持っています。

MenuItem usercontrolからこのプロパティを読み取るにはどうすればよいですか?私は現在Application.UseWaitCursorを使用しています。私はそれをbackgroundworkerで設定していますが、これは完全に動作しますが、カーソルを変更したくないです。だからこそ私が設定できる財産ははるかに良いと思ったのです。ここで

私のMainFormのコードです:ここで

public partial class MainForm : Form 
{ 
    public bool IsBackgroundBusy 
    { 
     get 
     { 
      return bwRefreshGalleries.IsBusy; 
     } 
    } 

は私のユーザーコントロールのコードは次のとおりです。

public partial class MenuItem: Label 
{ 
    private bool _disableIfBusy = false; 

    [Description("Change color if Application.UseWaitCursor is True")] 
    public bool DisableIfBusy 
    { 
     get 
     { 
      return _disableIfBusy; 
     } 

     set 
     { 
      _disableIfBusy = value; 
     } 
    } 

    public MenuItem() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnMouseEnter(EventArgs e) 
    { 
     if (Application.UseWaitCursor && _disableIfBusy) 
     { 
      this.BackColor = SystemColors.ControlDark; 
     } 
     else 
     { 
      this.BackColor = SystemColors.Control; 
     } 

     base.OnMouseEnter(e); 
    } 
+0

は、あなたの質問どのように[UserControlからのアクセスフォーム](http://stackoverflow.com/questions/14921354/access-form-from-usercontrol)の心臓部ですか? – ryanyuyu

+0

はい、そうだと思います。私は代わりにフォームのイベントを使用できることを知っていますが、私は、コントロールを再利用する際には、多くのメニューアイテムが作成されるため、可能な限り避けたいと思っていました。 – RoadRacer524

+0

@ryanyuyuこれは、あなたが1つのタイプのフォームにusercontrolをロックしても構いません。より複雑なのは、フォームインターフェイスを作成し、コントロールを使用するフォームにそれを継承させることです。 –

答えて

1

(注:それはあなたが実際にここUserControlかを持っているかどうか私にははっきりしていませんあなたが示しているMenuItemクラスは、UserControlオブジェクトを実際に扱っていないときには、おそらく "usercontrol"または "user control"という用語を使用しないでください)Labelを継承します。

完全なコード例がない場合、正しい解決策が何であるかを正確に知ることは難しいです。ただし、一般的な方法でBackgroundWorkerを使用していると仮定すると、あなたは、単にそれが変化するような制御に必要な状態を渡す(すなわちFormを含む)コントロールの所有者のために必要。例えば:

class MenuItem : Label 
{ 
    public bool IsParentBusy { get; set; } 
} 

// I.e. some method where you are handling the BackgroundWorker 
void button1_Click(object sender, EventArgs e) 
{ 
    // ...some other initialization... 

    bwRefreshGalleries.RunWorkerCompleted += (sender1, e1) => 
    { 
     menuItem1.IsParentBusy = false; 
    }; 

    menuItem1.ParentIsBusy = true; 
    bwRefreshGalleries.RunAsync(); 
} 

すでにRunWorkerCompletedイベントのハンドラを持っている場合は、ちょうど別のハンドラを追加するのではなく、そこにIsParentBusyプロパティを設定するステートメントを置きます。

は、代わりにApplication.UseWaitCursorプロパティを使用しての、あなただけのIsParentBusyプロパティを見ることができます。

他にも使用できるメカニズムがあります。私は、MenuItemコントロールが特定のFormサブクラスに縛られるべきではないという一般的な感想に同意します。何らかの理由で上記のあなたのケースでは動作しない場合は、あなたの質問に詳しく説明する必要があります:良いコード例を提供し、単にコントロールのコンテナが直接その状態を管理有するます

のために動作しません正確に理由を説明
+0

私の質問とあなたの答えを正しく記述するために使用する用語を明確にしていただきありがとうございます。それは私が考えなかった別の方法でちょうど私が欲しいものを達成します。ただし、設定時にエラーが発生します(送信者、e)。このスコープで宣言することはできません。なぜなら、「送信者」とは異なる意味を持つからです。しかし、私がそれを働かせることができれば、あなたが指摘していることは完璧です。 – RoadRacer524

+0

私は水たまりに溺れていました。私は「新しい」送信者とeventargs(s、i)を宣言し、それは完全に機能します。ありがとうございます@ピーター! – RoadRacer524

+0

お寄せください。他の人が同じような解決策を探している場合は、修正するために投稿を編集します。自分の間違いを自分で見つけられたらうれしいです。 :) –

関連する問題