Domanda

Uso il seguente codice per invocare e accedere alle proprietà sul mio da un thread diverso.

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

La mia domanda:

Se chiamo PFA (form = > form.Richbox1.Text = " Test ") - Voglio che PFA () controlli se l'azione è (Richbox1.Text) e in tal caso quindi Aggiungi " \ n " al testo (" Test ").

L'idea è di chiamare

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

anziché

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

In altre parole, voglio aggiungere automaticamente una nuova riga se l'azione è " Richbox1.Text = "

Come lo faccio? Non ho mai lavorato con azioni prima.

È stato utile?

Soluzione

E se lo facessi:

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


public void UpdateTextBox(RichTextBox box,string text)
{

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

   box.AppendText(text);
}

Non sarai in grado di guardare all'interno dell'azione e determinare se sta usando un cotnrol specifico al di fuori dell'azione. Pertanto, è necessario aggiungere \ n prima di chiamare PFA oppure fare in modo che PFA chiami una funzione che farà ciò che si desidera o che PFA attui la logica.

Altri suggerimenti

Puoi aggiungere un metodo di estensione per fare il trucco. Prova quanto segue.

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

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

MODIFICA Utilizzato il metodo AppendText anziché Text + =

Non puoi farlo nel modo desiderato. La funzione PFA non può controllare cosa c'è dentro il tuo delegato. Pensa a come risolvere il tuo compito in un altro modo.

[offtopic]
PS. Inoltre, la tua convenzione di denominazione non è molto buona. & Quot; PFA " non spiega cosa fa la funzione e per quanto riguarda "frmain" - di solito i nomi delle classi iniziano con la lettera maiuscola.
[/ Offtopic]

UPDATE: Lo farei un po 'meglio di quello che Josh ha offerto:

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

Puoi farlo passando dall'azione all'espressione > ;. Quindi puoi vedere cosa sta succedendo nel metodo in questo modo

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

Questo ti dà le informazioni necessarie per capire la proprietà, ma non come aggiungere il \ n. Lascio a te questo per scoprirlo. Penso che questo sia eccessivo qui, ma chissà, forse questo potrebbe aiutare te o qualcun altro, o persino ispirare una buona soluzione.

Una buona soluzione a cui potrei pensare a dove poter riutilizzare questa funzionalità è come un motore di regole in cui è possibile confrontare quale sia la proprietà a cui si accede ed eseguire un'azione subito dopo di essa, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top