Toon posts:

[C#] Rare foutmelding Activator

Pagina: 1
Acties:
  • 114 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo mensen. Ik ben wat aan het uit proberen en het wil niet echt vlotten. Ik wil alle objecten bekijken op een form en als het een object is dat ik zoek dan wil ik er wat mee doen. Het object dat ik nu hieronder zoek is textBox1. Daar wil ik dan de property Text van aanpassen.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
Type obj = this.GetType();
FieldInfo[] fields = obj.GetFields( BindingFlags.Instance | BindingFlags.NonPublic );
        
foreach( FieldInfo info in fields )
{
    if ( info.Name == "textBox1" )
    {
        Type MyType = info.GetType();

        object tempObject = (object)Activator.CreateInstance( MyType );

    }
}


Bij regel 10 krijg ik een error:

'LogBuilder.exe': Loaded 'c:\windows\assembly\gac\mscorlib.resources\1.0.5000.0_nl_b77a5c561934e089\mscorlib.resources.dll', No symbols loaded.
An unhandled exception of type 'System.MissingMethodException' occurred in mscorlib.dll

Additional information: Er is geen parameterloze constructor voor dit object opgegeven.

Ik heb werkelijk geen idee wat er mis gaat. Uit de voorbeelden die ik heb bestudeerd zou dit moeten werken. Weet iemand wat er mis gaat?

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 05-05 09:00

curry684

left part of the evil twins

Toch niet zo vreemd? info is van het type System.Reflection.FieldInfo, om precies te zijn van de daarvan derived internal/private class System.Reflection.RuntimeFieldInfo. Daarvan vraag je het type op, en die wil je instantieren.

Nog afgezien van dat RuntimeFieldInfo dus hidden is zou het op FieldInfo zelf ook niet lukken omdat die alleen een protected constructor heeft, oftewel die zou je zo ook niet kunnen instantieren.

Alle bovenstaande info afgeleid overigens door de debugger er even bij te pakken *hint hint* ;)

Professionele website nodig?


  • whoami
  • Registratie: December 2000
  • Nu online
Ik snap trouwens totaal niet wat je wilt doen ?
Als je field 'textBox1' heet, ga je opnieuw een object maken van het type FieldInfo ?
En FieldInfo heeft idd geen public constructor.

https://fgheysels.github.io/


  • SlowMeDown
  • Registratie: Mei 2003
  • Laatst online: 05-05 12:44
Als ik het goed begrijp, is het probleem eigenlijk heel simpel. Hij wil de Text property aanpassen van een control, indien de naam van die control "textBox1" is. Of in ieder geval iets in die trant. De gekozen oplossing is echter een 'beetje' vreemd.

Ga gewoon recursief door alle Controls op de Form heen en zoek naar de control "textBox1". Ik neem aan dat het een TextBox control is? Probeer anders eens zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    private void DoUpdateTextBoxControl(System.Windows.Forms.Control.ControlCollection collection, string name, string text)
        {
            for (int index = 0; index < collection.Count; index++)
            {
                if (collection[index].Name == name)
                {
                    ((TextBox)collection[index]).Text = text;
                    break;
                }
                else 
                {
                    DoUpdateTextBoxControl(collection[index].Controls, name, text);
                }
            }
        }

Roep deze method dan aan door de Controls collection van de Form mee te geven, de naam (textBox1) van de TextBox die je wilt zoeken mee te geven en ten slotte de tekst die je in de TextBox wilt plaatsen mee te geven.

Als je van een willekeurig object de Text property wilt wijzigen, moet je bovenstaande code aanpassen. Typecast dan niet naar een TextBox, maar gebruik reflection om te kijken of er een Text property aanwezig is en om de waarde van die property te wijzigen.

Verwijderd

Topicstarter
Dat is inderdaad wat ik zoek. In mijn voorbeeld gaat het om een textbox maar ik wil de code zo maken dat ik het voor alle objecten binnen een form kan gebruiken zodat ik ook bv ook een NotifyIcon kan aanpassen. Zodat het er ongeveer zo uit ziet: (dat is wat ik dus zoek)

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Type obj = this.GetType();
FieldInfo[] fields = obj.GetFields( BindingFlags.Instance | BindingFlags.NonPublic );
        
foreach( FieldInfo info in fields )
{
    if ( info.Name == "textBox1" || info.Name == "notifyIcon1" )
    {
        Type MyType = info.GetType();

        ( (info.FieldType) (info.Name) ).Text = "Ja hij werkt";

        }
    }
}

[ Voor 51% gewijzigd door Verwijderd op 04-07-2005 11:25 ]


  • SlowMeDown
  • Registratie: Mei 2003
  • Laatst online: 05-05 12:44
Is dit wat je zoekt?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Type obj = this.GetType(); 
FieldInfo[] fields = obj.GetFields( BindingFlags.Instance | BindingFlags.NonPublic ); 
         
foreach( FieldInfo info in fields ) 
{ 
    if ( info.Name == "textBox1" || info.Name == "notifyIcon1" ) 
    { 
        object fieldValue = info.GetValue(this);
                
        //( (info.FieldType) (info.Name) ).Text = "Ja hij werkt"; 
        PropertyInfo propInfo = fieldValue.GetType().GetProperty("Text");

        if (propInfo != null)
        {
            propInfo.SetValue(fieldValue, "Ja hij werkt", null);
        }
    } 
}

Verwijderd

Topicstarter
Je bent geweldig. Dit is inderdaad wat ik zoek. Toppie!

(nu maar eens gaan uitzoeken wat er nou allemaal binnen die code gebeurt)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 11:29

mulder

ik spuug op het trottoir

Uit het hoofd
C#:
1
2
3
4
5
6
7
8
if(typeof(this) == TextBox)
{
  TextBox tb = (TextBox)this;
  if(tb.Name == "textBox1")
  {
    tb.Text = "Blabalbla";
  }
}

[ Voor 9% gewijzigd door mulder op 04-07-2005 13:04 ]

oogjes open, snaveltjes dicht

Pagina: 1