문제
다음 코드를 사용하여 다른 스레드에서 내에서 속성을 호출하고 액세스합니다.
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을 추가하는 방법은 아닙니다. 나는 이것을 당신에게 맡겨서 알아 내겠다. 나는 이것이 여기에서 과잉이라고 생각하지만, 누가 알 수 있는지, 아마도 당신이나 다른 사람에게 도움이되거나 심지어 좋은 해결책을 고무시킬 수도 있습니다.
이 기능을 재사용 할 수있는 곳에 대해 생각할 수있는 좋은 솔루션은 규칙 엔진과 같습니다. 규칙 엔진과 같습니다.이 엔진은 액세스하는 속성이 무엇인지 비교하고 바로 작업을 수행하는 것 등을 비교할 수 있습니다.