Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Robin0
Thema: Frage zum Programmierstil: zwei Rückgabewerte [und Alternativen dazu, z.B. Exceptions]
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich nehme dazu immer
System.Tuple<T1,T2>
oder
System.Tuple<T1,T2,T3>
oder
..
..
..

Thema: [erledigt] Per Reflection.Emit einen Event mit explizitem add und remove generieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Habs denke ich:


            FieldBuilder eventField = tb.DefineField("m_PropertyChanged", typeof(PropertyChangedEventHandler), FieldAttributes.Public);

            EventBuilder eb = tb.DefineEvent("PropertyChanged", EventAttributes.None, typeof(PropertyChangedEventHandler));

            MethodBuilder mbEV = tb.DefineMethod("remove_PropertyChanged", MethodAttributes.Public |
                MethodAttributes.SpecialName |
                MethodAttributes.HideBySig | MethodAttributes.Virtual
                , null, new[] { typeof(PropertyChangedEventHandler) });

            MethodImplAttributes eventMethodFlags = MethodImplAttributes.Managed;
            mbEV.SetImplementationFlags(eventMethodFlags);
            var removeIl = mbEV.GetILGenerator();
            removeIl.Emit(OpCodes.Ldarg_0);
            removeIl.Emit(OpCodes.Ldarg_0);
            removeIl.Emit(OpCodes.Ldfld, eventField);
            removeIl.Emit(OpCodes.Ldarg_1);
            removeIl.EmitCall(OpCodes.Call, typeof(Delegate).GetMethod("Remove", new[] { typeof(Delegate), typeof(Delegate) }), null);
            removeIl.Emit(OpCodes.Castclass, typeof(PropertyChangedEventHandler));
            removeIl.Emit(OpCodes.Stfld, eventField);
            removeIl.Emit(OpCodes.Ret);
            MethodInfo miRemoveEvent = typeof(INotifyPropertyChanged).GetMethod("remove_PropertyChanged");
            tb.DefineMethodOverride(mbEV, miRemoveEvent);
            eb.SetRemoveOnMethod(mbEV);

            mbEV = tb.DefineMethod("add_PropertyChanged", MethodAttributes.Public |
                MethodAttributes.SpecialName |
                MethodAttributes.HideBySig | MethodAttributes.Virtual
                , null, new[] { typeof(PropertyChangedEventHandler) });

            mbEV.SetImplementationFlags(eventMethodFlags);
            var addIl = mbEV.GetILGenerator();
            addIl.Emit(OpCodes.Ldarg_0);
            addIl.Emit(OpCodes.Ldarg_0);
            addIl.Emit(OpCodes.Ldfld, eventField);
            addIl.Emit(OpCodes.Ldarg_1);
            addIl.EmitCall(OpCodes.Call, typeof(Delegate).GetMethod("Combine", new[] { typeof(Delegate), typeof(Delegate) }), null);
            addIl.Emit(OpCodes.Castclass, typeof(PropertyChangedEventHandler));
            addIl.Emit(OpCodes.Stfld, eventField);
            addIl.Emit(OpCodes.Ret);
            MethodInfo miAddEvent = typeof(INotifyPropertyChanged).GetMethod("add_PropertyChanged");
            tb.DefineMethodOverride(mbEV, miAddEvent);
            eb.SetAddOnMethod(mbEV);

Das einzige was ich jetz noch machen muss is meine "RaisePropertyChanged" im setter der variable aufzurufen

RaisePropertyChanged:


MethodBuilder mbRaisePropertyChanged = tb.DefineMethod("RaisePropertyChanged", MethodAttributes.Virtual, null, new Type[] { typeof(string) });

            var RaiseIl = mbRaisePropertyChanged.GetILGenerator();
            System.Reflection.Emit.Label RaiseIlExitLabel = RaiseIl.DefineLabel();
            RaiseIl.Emit(OpCodes.Ldarg_0);
            RaiseIl.Emit(OpCodes.Ldfld, eventField);//if
            RaiseIl.Emit(OpCodes.Ldnull);
            RaiseIl.Emit(OpCodes.Ceq);
            RaiseIl.Emit(OpCodes.Brtrue, RaiseIlExitLabel);//endif
            RaiseIl.Emit(OpCodes.Pop);
            RaiseIl.Emit(OpCodes.Ldarg_0);
            RaiseIl.Emit(OpCodes.Ldfld, eventField);
            RaiseIl.Emit(OpCodes.Ldarg_0);
            RaiseIl.Emit(OpCodes.Ldarg_1);
            RaiseIl.Emit(OpCodes.Newobj, typeof(PropertyChangedEventArgs).GetConstructor(new[] { typeof(string) }));
            RaiseIl.EmitCall(OpCodes.Callvirt, typeof(PropertyChangedEventHandler).GetMethod("Invoke"), null);
            RaiseIl.Emit(OpCodes.Nop);
            RaiseIl.Emit(OpCodes.Nop);
            RaiseIl.MarkLabel(RaiseIlExitLabel);
            RaiseIl.Emit(OpCodes.Ret);

Ich hab das erstellen der eigenschaften in eine Methode ausgelagert, und kenne "mbRaisePropertyChanged" da nicht, wie rufe ich die dann auf?? der typ is ja nochnich erstellt und ich kann die Methode dann nichg mit Type.GetMethod() suchen, da der Typ nochnich existiert.

Thema: [erledigt] Per Reflection.Emit einen Event mit explizitem add und remove generieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich bekomm ne fehlermeldung dass:

Fehler
{"Die Methode \"add_PropertyChanged\" im Typ \"Dynamic.DynamicType\" der Assembly \"Dynamic.DynamicAssembly, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null\" hat keine Implementierung.":"Dynamic.DynamicType"}

Der fehler tritt bei "_tb.CreateType();" auf

Mein reflection code dazu ist:


/*_tb is mein TypeBuilder*/

_tb.DefineEvent("PropertyChanged", EventAttributes.None, typeof(PropertyChangedEventHandler));

/*Jedes Feld bekommt bei mir ein eigenschaft, den setter baue ich so auf*/
MethodBuilder setPropMthdBldr =
                _tb.DefineMethod("set_" + _propertyName,
                  MethodAttributes.Public |
                  MethodAttributes.SpecialName |
                  MethodAttributes.HideBySig,
                  null, new[] { _propertyType });

            ILGenerator setIl = setPropMthdBldr.GetILGenerator();
            System.Reflection.Emit.Label modifyProperty = setIl.DefineLabel();
            System.Reflection.Emit.Label exitSet = setIl.DefineLabel();

            setIl.MarkLabel(modifyProperty);
            setIl.Emit(OpCodes.Ldarg_0);
            setIl.Emit(OpCodes.Ldarg_1);
            setIl.Emit(OpCodes.Stfld, fieldBuilder);

            /*INotifyPropertyChanged aufruf*/
            setIl.Emit(OpCodes.Ldarg_0);
            setIl.Emit(OpCodes.Ldstr, _propertyName);
            setIl.EmitCalli(OpCodes.Calli, System.Runtime.InteropServices.CallingConvention.ThisCall, typeof(void), new[] { typeof(Object), typeof(PropertyChangedEventArgs) });
             /**/

            setIl.Emit(OpCodes.Nop);
            setIl.MarkLabel(exitSet);
            setIl.Emit(OpCodes.Ret);

Thema: [erledigt] Per Reflection.Emit einen Event mit explizitem add und remove generieren
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

Ich versuche gerade INotifyPropertyChanged in eine per Reflection.Emit erstelle klasse einzubinden.

Ich hänge gerade fest, weil ich es nicht hinbekommen einen add und einen remove handler zu erstellen.


private PropertyChangedEventHandler PropertyChange;

/*Eig nur der untere teil*/
public event PropertyChangedEventHandler PropertyChanged
        {
            add { PropertyChange += value; }
            remove { PropertyChange -= value; }
        }

Weiß vielleicht jemand weiter, oder kennt ein buch über Reflection.emit?

Thema: Problem beim erstellen einer Tabelle über c#
Am im Forum: Datentechnologien

Versuchs mal damit:


new OleDbCommand("CREATE TABLE [dbo.][" + textBox1.Text + "] ([ID] INT NOT  NULL AUTO_INCREMENT, [ChatPartner] NVARCHAR (100) NOT NULL,  [Nachricht] NVARCHAR(1000), CONSTRAINT [" + textBox1.Tex + "_PK] PRIMARY KEY CLUSTERED ([ID] ASC))", conChat).ExecuteNonQuery();

Thema: Reflection.Emit.TypeBuilder DependencyProperty einbinden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,

Ich habe vor einer Dynamisch erstellten Klasse die von DependencyObject ableitet folgende struktur mitzugeben:


        public int MyProperty
        {
            get { return (int)GetValue(MyPropertyProperty); }
            set { SetValue(MyPropertyProperty, value); }
        }

        public static readonly System.Windows.DependencyProperty MyPropertyProperty =
            System.Windows.DependencyProperty.Register("MyProperty", typeof(int), typeof(DynamicTypeBuilder), new System.Windows.PropertyMetadata(default(int), OnMyPropertyChanged));

        private static void OnMyPropertyChanged(System.Windows.DependencyObject o, System.Windows.DependencyPropertyChangedEventArgs e)
        {
            ((DynamicTypeBuilder)o).OnMyPropertyChanged((int)e.OldValue, (int)e.NewValue);
        }

        private void OnMyPropertyChanged(int oldValue, int newValue)
        {
        }

Ich finde leiter nix zu dem thema was mir weiterhelfen könnte villeicht wisst ihr da ja mehr.

Ich hab folgende probleme:

(int)GetValue(MyPropertyProperty);
Ich weiß absolut nicht wie ich den wert der methode zurückgebe oder Die methode afrufe.

MyPropertyProperty =System.Windows.DependencyProperty.Register("MyProperty", typeof(int), typeof(DynamicTypeBuilder), new System.Windows.PropertyMetadata(default(int), OnMyPropertyChanged));
Müsste in ein statischen Construktor auch null ahnung wie ich da rangehen soll -.-.

((DynamicTypeBuilder)o).OnMyPropertyChanged((int)e.OldValue, (int)e.NewValue);
Nunja...

Villeicht kennt ja jemand ein gutes turtorial oder beispiel dazu.

Würde mich sehr freuen wenn jemand weiter weiß.

Thema: Einzelne CSV-Dateien in eine für Access geeignete Datenbank wandeln.
Am im Forum: Datentechnologien

Mit excel öffnen -> zellen markieren -> srg+c -> access öffnen -> Tabelle öffnen -> strg+v

Thema: Alle Pixel eines 3D-Dreiecks berechnen
Am im Forum: Grafik und Sound

Auf Youtube gibt es sehr viele gute Videos zum zeichen von Dreiecken.

Und für andere formen auch zum umrechnen von den Formen in Dreiecke(Polygone)

Leiderfällt mir grad keins ausm Kopf ein und mein internet is hier sehr lasch.
Findest bestimmt selbst ein paar gute videos :P

Thema: UDP Broadcast senden und Antworten auswerten
Am im Forum: Netzwerktechnologien

Kommen die antworten denn auf dem richtigen port an?

Schonmal mit einem snipper geschaut ob was richtiges ankommt.

Versuchmal dich mit einem TCPListener an den port zu hängen.

StartBackGroundProzess rufst du dann auf wenn du es für nötig hälst auf eine antwort zu warten(nach dem senden denke ich)

Da wo /*DeinCode zum empfangen der nachricht*/ steht schreibst du einfach den code zum empfangen der nachricht rein sowas wie *udpClient.Receive(ref RemoteIpEndPoint);*(du solltest den UdpClient natürlich der methode übergeben damit dieser die zur verfügung steht)

Thema: UDP Broadcast senden und Antworten auswerten
Am im Forum: Netzwerktechnologien

Ließ dir mal genau den abschitt hier durch


// Blocks until a message returns on this socket from a remote host.

d.h. wenn du keine nachricht zurückbekommst wird der prozess auch nicht weiter gehen.


        public static void StartBackGroundProzess()
        {         
            BackgroundWorker worker = new BackgroundWorker();

            worker.DoWork += new DoWorkEventHandler((bli, bla) => {/*DeinCode zum empfangen der nachricht*/});
            
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            worker.RunWorkerAsync();
        }

        private static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //eine nachricht wurde empfangen
           //Wenn du hier nie ankommst bekommst du keine antwort :P
        }

Thema: UDP Broadcast senden und Antworten auswerten
Am im Forum: Netzwerktechnologien

Hast du überhaupt eine gegenstelle die antwortet?

Wenn Receive sich aufhängt bekommst du anscheinend keine antwort.

Thema: UDP Broadcast senden und Antworten auswerten
Am im Forum: Netzwerktechnologien

Hast du subnets oder verwendest du 192.168.1.71 nur als test?

Nimm doch direkt den UdpClient anstatt dich mit den soccets abzumühen.
http://msdn.microsoft.com/de-de/library/system.net.sockets.udpclient%28v=vs.110%29.aspx

[Zudem kann es öfter sein das du lange auf eine antwort warten musst und sich dein Propgramm in der zwischenzeit aufhängt. Desshalb ist es ratsam das entfangen der Antwort in ein BackgroudWorker oder sonstiges auszulagern.]

Thema: Filter setzen bei einer über Relation verbundenen Tabelle
Am im Forum: Datentechnologien

1. Du kannst mit dr Datenbank schon filtern !!..WHERE...meiocvm.ArtikelNr = Artkel.ArtikelNr AND Artikel.ArtikelName LIKE "Fisch and chips"

2. Eine vorsortierte liste dem DataGridView übergeben

3.Das DataGridView so filtern dass du alle spalten aucf nichtsichtbar setzt die deinem suchmuster nichtentsprechen

[Edit
4 Und noch vieles mehr

Thema: SubItems in ToolStripDropdownButton
Am im Forum: GUI: Windows-Forms

Ich hab jetz einfach mal einf mit dem Designer in Wiforms ertsellt mit 1.überschrift und 1.Item mit unteritem hoffe das Hilf dir weiter :P


this.menuStrip1 = new System.Windows.Forms.MenuStrip();
            this.halloToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.ddlItem1ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.mLItem11ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            this.menuStrip1.SuspendLayout();
            this.SuspendLayout();
            // 
            // menuStrip1
            // 
            this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.halloToolStripMenuItem});
            this.menuStrip1.Text = "menuStrip1";
            // 
            // ToolStripMenuItem
            // 
            this.halloToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.ddlItem1ToolStripMenuItem});
            this.halloToolStripMenuItem.Name = "halloToolStripMenuItem";
            this.halloToolStripMenuItem.Text = "Filter";
            // 
            // ML_Item1ToolStripMenuItem
            // 
            this.ddlItem1ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
            this.mLItem11ToolStripMenuItem});
            this.ddlItem1ToolStripMenuItem.Name = "ddlItem1ToolStripMenuItem";
            this.ddlItem1ToolStripMenuItem.Text = "ML_Item1";
            // 
            // ML_Item1.1ToolStripMenuItem
            // 
            this.mLItem11ToolStripMenuItem.Name = "mLItem11ToolStripMenuItem";
            this.mLItem11ToolStripMenuItem.Text = "ML_Item1.1";

Thema: DependencyProperty Validation - Wert aus Button an Textbox übergeben
Am im Forum: GUI: WPF und XAML


private void OnTextValueChangedChanged(String oldValue, String newValue)
        {
                   //Hier bist du in der aktuellen instanz
                   Deinetextbox.Text = newValue
        }

        private static void TextValueChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
                  ((BrowserDialog)d). OnTextValueChangedChanged((String)e.OldValue, (String)e.NewValue);
        }

Thema: Datagrid, Problem mit Datencontext bei Bindung an Observablecollection<T>
Am im Forum: GUI: WPF und XAML

Namesspace deklarieren z.B


<Window
xmlns:dc="clr-namespace:AssemblyName"
>
.
.
.

<DataGrid>
    <DataGrid.DataContext>
        <dc:ClassName>
    </DataGrid.DataContext>
</DataGrid>

Thema: DependencyProperty Validation - Wert aus Button an Textbox übergeben
Am im Forum: GUI: WPF und XAML

Du musst das in "FrameworkPropertyMetadataOptions" machen :).
GEt und set werden bei Bindings nicht ausgeführt sonder nur der PropertyChangedCallback der DependencyProperty was in deinem fall "FrameworkPropertyMetadataOptions" ist.

Thema: Datagrid, Problem mit Datencontext bei Bindung an Observablecollection<T>
Am im Forum: GUI: WPF und XAML

dateien besitzt keinen öffentlichen get Accessor

dh:
Schreib

 
public ObservableCollection<Datei> Dateien{get{return dateien;}}
 


und binde auf Dateien.

Thema: Silverlight Exception mit Controls
Am im Forum: GUI: WPF und XAML

Hast du die SilverlightTolls undsowas alles zum debuggen installliert.

Ohne die bekommst du keine gescheite Fehlermeldung.http://msdn.microsoft.com/de-de/silverlight/bb187452.aspx

Thema: DataGrid zeigt beim Hinzufügen mehrerer Zeilen nicht alle an
Am im Forum: GUI: WPF und XAML

Wenn du die spalten Dynamisch erzeugst is das doch genau das richtige.
AutoGenerateColumns auf True. und fertig ^^.

Ein DataGrid Zeigt sogar die spalten an wen du den Typen dynamisch mit System.Emit.TypeBuilder() erzeugst.

Edit:
Wenn du eine neue liste verwenden willst dass schreibst du ==> MyCollection = new Observablecollection<T>(MyNewCollection);
!Kein Clear und auch keine neuzuweisung mit leerem konstruktor, sonst geht dir die eigenschaft verlorean das neue zeilen vom User erstellt werden können.!

@c# Matze
Zu dem vorletzten beitrag, Es geht schnell mit Inoty... auch bei 20.000 datensätzen.

Thema: DataGrid zeigt beim Hinzufügen mehrerer Zeilen nicht alle an
Am im Forum: GUI: WPF und XAML

@C#Matze

1. Übernimm das interface was ich vorhaer gepostet habe in deine Klasse;

2. Schreib


_dvLogMain.ListChanged += _dvLogMain.ListChanged += (sender, e) => { OnPropertyChanged("_dvLogMain") };
Das wars eigentlich schon

Du wendes tINotifyPropertyChanged ja auch nicht auf sondern in einem event an ;).

Thema: Die Spalte 'xy' hat die Einschränkung, dass sie eindeutig sein muss.
Am im Forum: Datentechnologien

Wenn die datensätze wirklich doppelt sind versuchst mit distinct.http://www.w3schools.com/sql/sql_distinct.asp

oder änder den datensatz mit der 161 einfach um.

Zudem solltest du die Spalte der Tabelle in deiner Datenbank wo der datensatz doppelt vorkommt mit UNIQUE Einschränken.

Thema: Die Spalte 'xy' hat die Einschränkung, dass sie eindeutig sein muss.
Am im Forum: Datentechnologien

Nehmen wir an du bekommst das raus warum auch immer das rauskommst...

meta_id1 | meta_id |meta_id
-----------| ----------- |---------
10-----------10-----------10
11-----------11-----------11
12-----------12-----------12
13-----------13-----------13
14-----------14-----------14
. .
. .
________________________
161----------161 ---------161|
161----------254 ---------254|
_______________________|

Wenn meta_id1 nun in deinem DataTable eine Primary Key einschränkung hat, kommt es zu einem fehler weil 161 x2 da ist.

Thema: Die Spalte 'xy' hat die Einschränkung, dass sie eindeutig sein muss.
Am im Forum: Datentechnologien

was bekommst du denn raus wenn dus nicht in ein datatable schreibst sondern irgentwoandershin, hast du dann die überschrift "meta_id" doppelt(was ich nicht denke)

Oder versucht dein DataTable eine neue tabelle zu generieren mit Primary Key einschränkungen, und die zahl 161 in "meta_id1"(in diesem fall die PK Spalte) ist 2x vorhanden (eher warscheinlich).

Thema: Datenstruktur flexibel gestalten
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Verwende doch die
System.ComponentModel.ISite Schnittstelle

oder

 
public class MyHierarchicalClass<TChild, TParent>
{
        List<TChild> Child {get; set;}
        TParent Parent {get; set;}
}
 
genauer eher

 
public class MyHierarchicalClassBase<TChild, TParent> : Node<TChild, TParent> 
where TChild : Node
{

}
public class Node<TChild, TParent> : Node<TParent>
{
        List<TChild> Child {get; set;}      
}
public class Node<TParent> : Node
{
TParent Parent {get; set;}
}
//edit
class Node
{
}

 

Thema: Die Spalte 'xy' hat die Einschränkung, dass sie eindeutig sein muss.
Am im Forum: Datentechnologien

Daran sollte es nicht liegen die fehlermeldung geht außerdem zu der spalte meta_id1.
(foreign key´s und Primary key´s heißen be imir unter jeden datenbanksystem gleich und Joins waren da nochnie ein problem)

Welches datenbanksystem verwendest du eig Tweaky?

Thema: Die Spalte 'xy' hat die Einschränkung, dass sie eindeutig sein muss.
Am im Forum: Datentechnologien

Ist der wert 161 denn 2mal vorhanden in der tabelle vorhanden?

Thema: C# Umsetzung von C++ Code: Pointer "data" durch ein char array[] ersetzt, aber wie?
Am im Forum: Rund um die Programmierung

Nach genauerem anschauen des codes glaube ich nicht unbedingt das du weißt was da wirklich passiert.

mach aus "char *data", ein "out char[] data" oder "ref char[] data"

Thema: C# Umsetzung von C++ Code: Pointer "data" durch ein char array[] ersetzt, aber wie?
Am im Forum: Rund um die Programmierung

Du kannst Ein IntPtr als Pointer in C# nehmen, musst aber den code als unsave markieren.

unsafe (C#-Referenz)

den rest kannst du eig genauso übernehmen.

Thema: Datum möglichst kompakt als String darstellen
Am im Forum: Rund um die Programmierung

@Zoomi

Mit einem Datum dem Jahre 1970 würde das gnze nicht funktionieren.
Aber wenn soetwas nicht vorkommt is gut.