2009-04-29 21 views
1

Ich verwende den folgenden Code, um Eigenschaften von einem anderen Thread aufzurufen und darauf zuzugreifen.C#: Wie erhält man den zugewiesenen Wert von einer Aktion?

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); 
    } 

Meine Frage:

Wenn ich rufe PFA(form => form.Richbox1.Text = "Test") - Ich möchte PFA() überprüfen, ob die Aktion (Richbox1.Text) und wenn ja, dann hinzufügen "\ n" auf den Text ("Test ").

Die Idee ist

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

statt

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

Mit anderen Worten anrufen will ich eine neue Zeile automatisch hinzufügen, wenn die Aktion "Richbox1.Text =" ist

Wie mache Ich das? Ich habe vorher noch nie mit Aktionen gearbeitet.

Antwort

1

Was passiert, wenn Sie getan haben:

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


public void UpdateTextBox(RichTextBox box,string text) 
{ 

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

    box.AppendText(text); 
} 

Ihr nicht gehen in der Lage, in die Aktion zu schauen und festzustellen, dass es ein bestimmtes cotnrol von außerhalb der Handlung verwendet. Entweder müssen Sie das \ n vor dem Aufruf von PFA hinzufügen, oder PFA muss eine Funktion aufrufen, die das tut, was Sie wollen, oder PFA muss die Logik implementieren.

1

Sie können eine Erweiterungsmethode hinzufügen, um den Trick zu machen. Versuche Folgendes.

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

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

EDIT die Methode AppendText Anstelle von Text + =

+0

Es tut mir leid , Sie haben mich falsch verstanden. "Test" war nur ein Beispiel. Ich füge der ganzen Zeit Text hinzu, ich möchte nur eine neue Zeile mit dem Text und seiner nicht nur einer RichTextBox hinzufügen. –

1

Sie können diesen Weg nicht tun Sie wollen. Die PFA-Funktion kann nicht überprüfen, was sich in Ihrem Delegaten befindet. Überlegen Sie, wie Sie Ihre Aufgabe anders lösen können.

[offtopic]
PS. Außerdem ist Ihre Namenskonvention nicht sehr gut. "PFA" erklärt nicht, was die Funktion tut und wie für "frmain" - Klassennamen beginnen in der Regel mit Großbuchstaben.
[/ offtopic]

UPDATE: Ich würde es ein wenig besser, als Josh angeboten:

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

einverstanden w/frmain, aber PFA ist nicht so schlecht, weil ich denke, es ist PerformFormAction –

+0

PFA = PerformAction, frmain = FormMain.Könnten Sie vorschlagen, eine andere Möglichkeit, um dieses Problem zu lösen? –

+1

Ich denke, er sagt, dass Frmain konsistenter wäre mit den empfohlenen Namenskonventionen, die FormMain genannt werden. –

0

Sie können dies erreichen, indem Sie von Aktion zu Ausdruck> wechseln. Dann können Sie sehen, was wie so in der Methode geschieht

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) 
} 

Dies gibt Ihnen die Informationen, die Sie benötigen die Eigenschaft, um herauszufinden, aber nicht, wie die \ n anhängen. Ich überlasse das Ihnen, um es herauszufinden. Ich denke, das ist hier ein Overkill, aber wer weiß, vielleicht könnte Ihnen das oder jemand anderes helfen oder sogar eine nette Lösung für Sie schaffen.

Eine schöne Lösung, die ich vielleicht denken könnte, wo Sie diese Funktionalität wie in der Regel wieder verwenden könnte Motor ist, wo man vergleichen könnte, was die Eigenschaft zugegriffen wird und eine Aktion direkt nach dem Laufen usw.

Verwandte Themen