1

次のコードを使用して、別のスレッドから my from のプロパティを呼び出してアクセスします。

    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")- アクションが (Richbox1.Text) であるかどうかを PFA() に確認させ、そうであればテキストに "\n" を追加します ("Test")。

アイデアは、呼び出すことです

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

それ以外の

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

つまり、アクションが「Richbox1.Text =」の場合、自動的に新しい行を追加したい

どうやってそれをするのですか?これまでアクションを扱ったことはありませんでした。

4

4 に答える 4

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 にロジックを実装させる必要があります。

于 2009-04-29T17:19:29.523 に答える
1

トリックを実行する拡張メソッドを追加できます。以下を試してください。

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

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

編集Text+= の代わりに AppendText メソッドを使用

于 2009-04-29T17:08:18.270 に答える
1

あなたが望むようにこれを行うことはできません。PFA 関数は、デリゲートの内容を確認できません。別の方法でタスクを解決する方法を考えてください。

[オフトピック]
PS。また、あなたの命名規則はあまり良くありません。「PFA」は関数が何をするかを説明しません。「frmain」に関しては、通常、クラス名は大文字で始まります。
[/オフトピック]

更新:ジョシュが提供したよりも少しうまくやります:

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;
}
于 2009-04-29T17:14:15.870 に答える
0

これは、Action から Expression> に移動することで実現できます。次に、メソッドで何が起こっているかを次のように見ることができます

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 を追加する方法はわかりません。これはあなたに任せます。これはやり過ぎだと思いますが、おそらくこれはあなたや他の誰かを助けるかもしれませんし、素晴らしい解決策を刺激するかもしれません.

この機能をどこで再利用できるかを考えることができる良い解決策は、アクセスされているプロパティが何であるかを比較し、その直後にアクションを実行するルールエンジンのようなものです.

于 2009-04-29T17:26:16.933 に答える