문제

다음 코드를 사용하여 다른 스레드에서 내에서 속성을 호출하고 액세스합니다.

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

내 질문:

내가 전화하면 PFA(form => form.Richbox1.Text = "Test") -PFA ()가 작업이 (Richbox1.Text)인지 확인하고 그렇다면 텍스트 ( "테스트")에 " n"을 추가합니다.

아이디어는 전화하는 것입니다

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

대신에

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

다시 말해서 동작이 "richbox1.text ="인 경우 새 라인을 자동으로 추가하고 싶습니다.

어떻게해야하나요? 나는 전에 행동을 한 적이 없다.

도움이 되었습니까?

해결책

당신이했다면 :

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


public void UpdateTextBox(RichTextBox box,string text)
{

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

   box.AppendText(text);
}

당신은 동작 내부를 들여다보고 행동 외부에서 특정 cotnrol을 사용하고 있다고 판단 할 수 없을 것입니다. 따라서 PFA를 호출하기 전에 n을 추가하거나 PFA가 원하는 작업을 수행하는 함수를 호출하거나 PFA가 논리를 구현하도록해야합니다.

다른 팁

트릭을 수행하기 위해 확장 방법을 추가 할 수 있습니다. 다음을 시도하십시오.

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

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

편집하다 텍스트+= 대신 appendText 메소드를 사용했습니다

당신은 원하는 방식으로 이것을 할 수 없습니다. PFA 기능은 대의원 내부에 무엇이 있는지 확인할 수 없습니다. 다른 방법으로 작업을 어떻게 해결할 수 있는지 생각해보십시오.

주제를 벗어
추신. 또한, 당신의 이름 지정 협약은 그리 좋지 않습니다. "PFA"는 기능이 무엇을하는지 설명하지 않고 "Frmain"에 관해서는 일반적으로 클래스 이름이 대문자로 시작합니다.
/주제를 벗어

업데이트 : Josh가 제안한 것보다 조금 더 잘 할 것입니다.

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

행동에서 표현으로 이동하여이를 달성 할 수 있습니다. 그런 다음 방법에서 무슨 일이 일어나고 있는지 볼 수 있습니다.

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

이것은 속성을 파악하는 데 필요한 정보를 제공하지만 n을 추가하는 방법은 아닙니다. 나는 이것을 당신에게 맡겨서 알아 내겠다. 나는 이것이 여기에서 과잉이라고 생각하지만, 누가 알 수 있는지, 아마도 당신이나 다른 사람에게 도움이되거나 심지어 좋은 해결책을 고무시킬 수도 있습니다.

이 기능을 재사용 할 수있는 곳에 대해 생각할 수있는 좋은 솔루션은 규칙 엔진과 같습니다. 규칙 엔진과 같습니다.이 엔진은 액세스하는 속성이 무엇인지 비교하고 바로 작업을 수행하는 것 등을 비교할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top