2013-12-13 3 views
0

나는 TextBox1Button1이라고하는 Windows Form을 가지고 있습니다. Button1을 클릭하면 새 TextBox2이 처음 TextBox1 아래에 생성됩니다. TextBox1에서 TextBox2으로 모든 속성을 가져 와서 정확히 같은 방식 (크기, 텍스트, 배경색, 글꼴 등)으로 보이게하려면 어떻게해야합니까?한 요소에서 다른 요소로 속성을 가져 오는 방법은 무엇입니까?

+0

소위 Memberwise 복제본을 찾고 있습니다. 자세한 내용은이 스레드를 참조하십시오 : http://stackoverflow.com/questions/5574024/create-a-clone-of-this-object-not-point-to-it – MrPaulch

+0

@MrPaulch MemberwiseClone()은 나를 보호하기 때문에 나를 위해 일한다 - 과부하 해결 오류가 발생한다. – Dobrobobr

+0

그래, 당신은 자신의 파생물을 만들어야 할 것 같다. 그 방법은 섀도 잉이나 커스텀 래퍼를 통해 그 메서드를 노출시킨다. 귀하의 경우에는 Fabian Biglers 제안을 신중하게 사용하는 것으로 보입니다. – MrPaulch

답변

0

당신은 (C 번호에 대한 죄송) 텍스트 상자를 복제하는 반사를 사용할 수 있습니다

private void button1_Click(object sender, EventArgs e) 
{ 
TextBox t = (TextBox)CloneObject(textBox1); 
} 

private object CloneObject(object o) 
{ 
Type t = o.GetType(); 
PropertyInfo[] properties = t.GetProperties(); 

Object p = t.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, null, o, null); 

foreach(PropertyInfo pi in properties) 
{ 
if(pi.CanWrite) 
{ 
pi.SetValue(p, pi.GetValue(o, null), null); 
} 
} 

return p; 
} 
0

큰 감사를 파비안 Bigler 자신의 C# 코드에 대해. VB.net에 해당하는 내용은 다음과 같습니다.

Private Function CloneControl(ByVal control As Object) As Object 
    Dim type As Type = control.GetType() 
    Dim properties As PropertyInfo() = type.GetProperties() 
    Dim retObject As Object = type.InvokeMember("", System.Reflection.BindingFlags.CreateInstance, Nothing, control, Nothing) 
    For Each p As PropertyInfo In properties 
     If p.CanWrite Then 
       p.SetValue(retObject, p.GetValue(control, Nothing), Nothing) 
     End If 
    Next 
    Return retObject 
End Function 

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Combobox3 = DirectCast(CloneControl(ComboBox2), ComboBox) 
End Sub 
관련 문제