Frage

Ich verwende den folgenden Code aufrufen und Zugriffseigenschaften auf meine aus von einem anderen Thread.

    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 PFA(form => form.Richbox1.Text = "Test") nennen. - Ich PFA will () überprüfen, ob die Aktion (Richbox1.Text) und wenn ja, dann hinzufügen "\ n" auf den Text ( "Test")

Die Idee ist, zu nennen

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

statt

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

Mit anderen Worten mag ich automatisch eine neue Zeile hinzufügen, wenn die Aktion „Richbox1.Text =“

Wie kann ich das tun? Ich vorher noch nie mit Aktionen gearbeitet.

War es hilfreich?

Lösung

Was ist, 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 geht der Lage sein, nicht in der Handlung zu betrachten und bestimmen, es ist eine bestimmte cotnrol von außerhalb der Aktion verwendet wird. So müssen Sie entweder die \ n hinzufügen, bevor Sie PFA nennen, oder haben PFA eine Funktion aufrufen, die das tun, was Sie wollen, oder haben PFA die Logik implementieren.

Andere Tipps

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

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

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

Bearbeiten verwendet, um die AppendText Methode anstelle von Text + =

Sie können dies die Art und Weise nicht tun Sie wollen. PFA-Funktion kann nicht überprüfen, was ist in Ihrem delegieren. Überlegen Sie, wie Sie Ihre Aufgabe eine andere Art und Weise zu lösen.

[offtopic]
PS. Auch ist Ihre Namenskonvention nicht sehr gut. „PFA“ nicht erklären, was die Funktion tut und wie für „frmain.“ - in der Regel Klassennamen beginnen 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;
}

Sie können dies erreichen, indem von Aktion zu Expression bewegen>. 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)
}

Das gibt Ihnen die Informationen, die Sie benötigen die Eigenschaft, um herauszufinden, aber nicht, wie die \ n anhängen. Ich werde es dir überlassen, um herauszufinden. Ich denke, das viel des Guten hier ist, aber wer weiß, vielleicht könnte dies Sie oder jemand anderes helfen, oder sogar eine schöne Lösung zu begeistern.

Eine schöne Lösung, die ich vielleicht denken könnte, wo Sie diese Funktion wieder verwenden könnten, ist wie eine Regel-Engine, wo man vergleichen könnte, was die Eigenschaft zugegriffen wird, und eine Aktion direkt nach dem Laufen, etc.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top