Question

J'utilise le code suivant pour invoquer et accéder aux propriétés de mon à partir d'un autre 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);
    }

Ma question:

Si j'appelle PFA (form = > form.Richbox1.Text = " Test &); , je souhaite que PFA () vérifie si l'action est (Richbox1.Text) et, le cas échéant, puis ajoutez " \ n " au texte ("Test").

L'idée est d'appeler

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

au lieu de

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

En d'autres termes, je souhaite ajouter automatiquement une nouvelle ligne si l'action est "Richbox1.Text ="

.

Comment je fais ça? Je n'ai jamais travaillé avec des actions auparavant.

Était-ce utile?

La solution

Et si vous le faisiez:

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


public void UpdateTextBox(RichTextBox box,string text)
{

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

   box.AppendText(text);
}

Vous ne pourrez pas regarder à l'intérieur de l'action et déterminer qu'il utilise un cotnrol spécifique en dehors de l'action. Vous devez donc soit ajouter le \ n avant d'appeler PFA, soit demander à PFA d'appeler une fonction qui fera ce que vous voulez, ou bien faire en sorte que PFA mette en œuvre la logique.

Autres conseils

Vous pouvez ajouter une méthode d'extension pour faire l'affaire. Essayez ce qui suit.

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

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

EDIT a utilisé la méthode AppendText au lieu de Text + =

Vous ne pouvez pas le faire comme vous le souhaitez. La fonction PFA ne peut pas vérifier ce qui se trouve à l'intérieur de votre délégué. Pensez à la façon dont vous pouvez résoudre votre tâche d’une autre manière.

[offtopic]
PS De plus, votre convention de nommage n’est pas très bonne. " PFA " n'explique pas ce que fait la fonction et quant à " frmain " - les noms de classe commencent généralement par une lettre majuscule.
[/ offtopic]

UPDATE: Je le ferais un peu mieux que ce que Josh offrait:

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

Pour ce faire, vous pouvez passer d’Action à Expression > ;. Ensuite, vous pouvez regarder ce qui se passe dans la méthode comme si

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

Ceci vous donne les informations dont vous avez besoin pour comprendre la propriété, mais pas comment ajouter le \ n. Je vous laisse le soin de le découvrir. Je pense que c'est exagéré ici, mais qui sait, cela pourrait peut-être vous aider ou aider quelqu'un d'autre, ou même inspirer une solution intéressante.

Une solution intéressante, je pourrais éventuellement penser à l'endroit où vous pourriez réutiliser cette fonctionnalité est comme un moteur de règles où vous pouvez comparer la propriété à laquelle vous accédez et exécuter une action juste après, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top