Laden...

Reflection

Erstellt von falk.1 vor 19 Jahren Letzter Beitrag vor 19 Jahren 1.402 Views
F
falk.1 Themenstarter:in
3 Beiträge seit 2004
vor 19 Jahren
Reflection

hallo,

ich habe eine klasse dir von form abgeleitet ist, mit einem label.
jetzt möchte ich eine eigenschaft meiner klasse zur laufzeit ändern,
das geht!
aber jetzt möchte ich die text-eigenschaft meines labels ändern,
habe aber nur das this-objekt zu verfügung?

kann mir da jemand helfen?

C
65 Beiträge seit 2004
vor 19 Jahren

Nochmal zum Mitschneiden für mich...

Du hast eine FormIrgendwas : Form. Darauf klebt ein Label...

class myForm : Form
{
   private Label myLabel;
   // <-- diese Stelle bitte merken!
   public void myForm()
   {
      this.InitializeComponent();
   }

   private void InitializeComponent()
   {
      // sonstigen krams a la Form Designer weggelassen
      this.myLabel = new Label();
      this.myLabel.Location = new Point(10, 10);
      this.myLabel.Size = new Size(50, 20);
      this.myLabel.Text = "mein Text";

      this.Controls.Add(this.myLabel);
   }
}

Und jetzt willst Du die Text-Eigenschaft Deines Labels von "außen" ändern? Dann füge einfach an die Stelle, die Du Dir da oben merken solltest, dieses ein...

   public string myLabelText
   {
      get { return this.myLabel.Text; }
      set { this.myLabel.Text = value; }
   }

... und schon kannst Du per

myForm frm = new myForm();
frm.myLabelText = "mein neuer Text";

den Text ändern.

... oder hab ich jetzt was falsch verstanden?

/// <summary>
/// Signatur
/// </summary>

F
falk.1 Themenstarter:in
3 Beiträge seit 2004
vor 19 Jahren
nicht ganz so

ich will aus einer Xml-Datei Eigenschaften Laden und zwar über eine Klasse die das automatisch prüft.

xml-datei


<Namespace Name="TestApp">
	<Class Name="Form1">
		<Property Name="Text" Value="TestPropForm" />
		<Variable Name="label1">
			<Property Name="Text" Value="TestLable" />
		</Variable>
		<Variable Name="test" Value="testString" /> // hier wird der else zweig eingelesen, z.B. string
	</Class>
</Namespace>



private void LoadVariable(XmlNode _node)
{
    FieldInfo fieldInfo = null;
    PropertyInfo propInfo = null;
    Type tempType = _this.GetType();
    string _name;

			if(_node.Name == "Variable")
				if(_node.HasChildNodes)
				{						
					fieldInfo = tempType.GetField( _node.Attributes["Name"].Value ,BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
				
				
					foreach(XmlNode node in _node.ChildNodes)				
						if(node.Name == "Property")
						{
							propInfo = fieldInfo.FieldType.GetProperty(node.Attributes["Name"].Value);
							if(propInfo != null)
							{								 
								

								propInfo.SetValue(_this,node.Attributes["Value"].Value,null);
														
							}
							
						}				
				}
				else
				{
					//_name = _node.Attributes["Name"].Value;
					fieldInfo = tempType.GetField( _node.Attributes["Name"].Value,BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
					if(fieldInfo != null)
						fieldInfo.SetValue(_this,_node.Attributes["Value"].Value);
				}

E
63 Beiträge seit 2003
vor 19 Jahren

du versuchst die Text eigenschaft einer page klasse zu aendern
(this ist in deinem code ausschnitt eine ableitung von page).
entweder du fuegst deiner abgeleiteten page klasse so eine
eigenschaft hinzu, oder du laeufst ueber die page controls und suchst
dein label. dazu koenntest du z.b. in die xml datei ja noch eine control
id aufnehmen.


for ( int i=0; i<this.controls.length; ++i)
  if ( controls[i].name == nameAusXmlDatei )
      setzeControlTextEigenschaft(control[i],textEigenschaftAusXmlDatei);


// auch eine moeglichkeit
setzeControlTextEigenschaft(control c,string text)
{
  try {
      c.GetType().InvokeMember("Text",System.Reflection.BindingFlags.SetProperty,
           null,c,new object[]{text});
  catch {
  }
}