2009-04-29 10 views
1

次のコードを使用して、myのプロパティを別のスレッドから呼び出してアクセスします。C#:アクションから割り当てられた値を取得する方法?

public static void PFA(Action<frmain> action) 
    { 
     var form = Form.ActiveForm as frmain; 
     if (form != null) 
     { 
      form.PerformAction(action); 
     } 
    } 

    public void PerformAction(Action<frmain> action) 
    { 
     if (InvokeRequired) 
      Invoke(action, this); 
     else 
      action(this); 
    } 

私の質問:

私はPFA(form => form.Richbox1.Text = "Test")を呼び出す場合 - 私は(PFAをしたい)アクションは(Richbox1.Text)であるかどうかをチェックし、もしそうであれば、テキスト(「テストに "\ n" を追加します")。

アイデアは、私はアクションが

"Richbox1.Text =" であれば自動に新しい行を追加する代わりに、言い換えれば

PFA(form => form.Richbox1.Text = "Test\n"); 

PFA(form => form.Richbox1.Text = "Test"); 

を呼び出すことです私はどのようにそれを行うのですか?私は前に行動をしたことはありません。

答えて

1

をあなたがやったらどう:

PFA(form => UpdateTextBox(form.Richbox1,"Test")); 


public void UpdateTextBox(RichTextBox box,string text) 
{ 

    if (box.Name=="Richbox1") 
    { 
     text+="\n"; 
    } 

    box.AppendText(text); 
} 

をあなたはするつもりはない 私はジョシュが提供するよりも、少し良くそれを行うだろう行動の内部を見ることができ、それが行動の外側からの特定のコトロールを使用していると判断することができます。したがって、PFAを呼び出す前に\ nを追加するか、PFAに必要な機能を実行させるか、PFAにロジックを実装させるかのどちらかを行う必要があります。

1

トリックを行う拡張方法を追加できます。以下を試してください。テキストのappendTextメソッドを代わりに使用

public static void AddNewLineIfMatch(this RichTextBox rtb, string toMatch) { 
    if (rtb.Text == toMatch) { 
    rtb.AppendText("\n"); 
    } 
} 

PFDA(() => form.Richbox1.AddNewLineIfMatch("Test")); 

EDITは+ =

+0

ごめんなさいあなたは私のことを誤解していました。「テスト」は単なる例でした。私はいつもそれにテキストを追加しました。テキストだけでなくリッチテキストボックスも一緒に新しい行を追加したいだけです。 –

1

あなたが望むこの方法を行うことはできません。 PFA関数は、代理人の内部にあるものを確認できません。別の方法であなたの仕事をどのように解決できるか考えてみましょう。

[012] PS。また、あなたの命名規則はあまり良くありません。 "PFA"は関数が何をするのか "frmain"を説明しません。通常、クラス名は大文字で始まります。
[/ offtopic]

UPDATE:

PFA(form => SetControlText(form.Richbox1, "Test")); 

public void SetControlText(Control control, string text) 
{ 
    control.Text = text; 
    // choose control type for which you want to add new line 
    if(control is RichTextbox || control is TextBox || control is ...) 
    control.Text += Environment.NewLine; 
}
+0

はfrmainに同意しますが、PFAはそれほど悪くありませんPerformFormAction –

+0

PFA = PerformAction、frmain = FormMain.この問題を解決する別の方法を提案できますか? –

+1

私は彼がfrmainがFormMainと呼ばれる推奨命名規則でより一貫していると言っていると思います。 –

0

これは、[アクション]から[式]に移動することで実現できます。そして、あなたはとても

public static void PFA(Expression<Action<frmain>> expression) { 
    // this will give you form.RichTextBox1 
    var targetFormProperty = (MemberAccessExpression)expression.Body; 
    // this only works for your example given. this gives you RichTextBox1.Text 
    var textProperty = (MemberAccessExpression)targetFormProperty.Expression; 

    // this is how you would run your action like normal 
    var action = expression.Compile(); 
    action(); // invoke action (you would want to wrap this in the invoke check) 
} 

これはあなたが\ nを追加する方法はないプロパティを把握する必要がありますが、情報を与えるようにする方法では何が起こっているかを見ることができます。私はあなたにこれを残して見つけることができます。私はこれがここでは過剰だと思うが、誰かが知っている、おそらくこれはあなたや他の人を助けるかもしれない、またはすてきな解決策を促す。

私は、おそらくあなたは、この機能を使用すると、アクセスされているプロパティが何であるかを比較して、右のそれの後にアクションを実行する可能性があるルールエンジンのようなものである再利用可能性がどこを考える可能性が素敵な溶液は、など

関連する問題