Pergunta

Eu uso o seguinte código para propriedades de invocar e de acesso no meu a partir de um thread diferente.

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

Minha pergunta:

Se eu chamar PFA(form => form.Richbox1.Text = "Test") - Quero PFA () para verificar se a ação é (Richbox1.Text) e em caso afirmativo, em seguida, Adicionar "\ n" ao texto ( "Test")

.

A idéia é chamar

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

em vez de

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

Em outras palavras eu quero adicionar uma nova linha automaticly se a ação é "Richbox1.Text ="

Como eu faço isso? Eu nunca trabalhei com ações antes.

Foi útil?

Solução

E se você fez:

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


public void UpdateTextBox(RichTextBox box,string text)
{

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

   box.AppendText(text);
}

Você não vai ser capaz de olhar para dentro da ação e determinar que ele está usando um cotnrol específica de fora da ação. Então, ou você precisa adicionar o \ n antes de chamar PFA, ou ter PFA chamar uma função que irá fazer o que quiser, ou ter PFA implementar a lógica.

Outras dicas

Você pode adicionar um método de extensão para fazer o truque. Tente o seguinte.

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

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

Editar utilizado o método AppendText em vez de Texto + =

Você não pode fazer isso da maneira que quiser. função PFA não pode verificar o que é está dentro do seu delegado. Pense como você pode resolver sua tarefa de outra maneira.

[offtopic]
PS. Além disso, sua convenção de nomenclatura não é muito bom. significa "PFA" não explica o que a função faz e como para "frmain." - geralmente nomes de classe começar com letra maiúscula
[/ Offtopic]

UPDATE: Gostaria de fazê-lo um pouco melhor, do que Josh oferecido:

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

Você poderia fazer isso ao passar de Ação para Expression>. Então você pode olhar para o que está acontecendo no método como assim

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

Isto dá-lhe a informação que você precisa descobrir a propriedade, mas não como acrescentar o \ n. Vou deixar isso até você para descobrir. Eu acho que isso é um exagero aqui, mas quem sabe, talvez isso poderia ajudar você ou alguém, ou até mesmo inspirar uma solução agradável.

A solução agradável i poderia pensar de onde você pode reutilizar essa funcionalidade é como um mecanismo de regras, onde você pode comparar o que a propriedade que está sendo acessado é e executar uma certa ação depois, etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top