Laden...
Avatar #avatar-3263.gif
elTorito myCSharp.de - Member
Dynamics Nav - ERP System Manager - gelernter Anwendungsentwickler Niederrhein Dabei seit 28.07.2009 177 Beiträge
Benutzerbeschreibung

Forenbeiträge von elTorito Ingesamt 177 Beiträge

26.10.2011 - 14:54 Uhr

Du kannst dich doch auch durch die Fibonacci-Zahlen annähern. Der goldene Schnitt entspricht dem Verhältnis von fib(n) zu fib(n+1). Je größer du n wählst, desto genauer näherst du dich an - 2:3 (1,5), 3:5 (1,6), 5:8 (1,625), 8:13 (1,61538)....

Hi,

ja , genau, das habe ich eben auch noch getan und das Ergebnis reicht mir, war ja dann doch nicht so schwer? 🤔

vielen Dank an euch allen!!

PS: Hab mich an der PHI Liste hier orientiert, ich weiß zwar nicht wie die Zustande kam, und wie genau die ist, aber mit "mein Programm" für die Fibonacci Zahl an 20000ter Stelle schaffe ich eine Übereinkunft bis ca. zu Zeile 30 der genannten Liste.


    public class GoldenRatio 
    {

        // Speichert die errechneten Zahlen
        List<BigInteger> _digitList = new List<BigInteger>();
        // Maximale Anzahl Durchläufe
        BigInteger _maxIterations = 6500;
        // Fibonacci Zahl 
        BigInteger _fn = 9000;
        // Durchläufe zählen
        int _loops = 0;

        public GoldenRatio()
        {
            BigInteger f = (BigInteger)(FibonacciIteration(_fn));
            BigInteger f1 = (BigInteger)FibonacciIteration(_fn + 1);
            CalcDivision(f1, f);
        }

        /// <summary>
        ///  Fibonacci Iteration 
        ///  Sucht die Fibonacci Zahl an nter Stelle und gibt diese zurück
        /// </summary>
        /// <param name="n">BigInteger</param>
        /// <returns></returns>
        private BigInteger FibonacciIteration(BigInteger n)
        {
            BigInteger f1, f2, f3;
            BigInteger i;
            BigInteger sum;
                
            if (n == 0) return 0;
            if (n == 1) return 1;
                
            f1 = 0;
            f2 = 1;
            f3 = 0;
            sum = 0;

            for (i = 2; i <= n; i++)
            {
                f3 = f1 + f2;
                f1 = f2;
                f2 = f3;
            }
            return f3;
        }

        /// <summary>
        /// Berechnet einen Bruch von BigInteger mit Modulo bis Rest = 0 oder Max. Anzahl Durchläufe erreicht
        /// </summary>
        /// <param name="a">Biginteger</param>
        /// <param name="b">BigInteger</param>
        private void CalcDivision(BigInteger a, BigInteger b)
        {
            _loops++;

            BigInteger rest;
            BigInteger value = BigInteger.DivRem(a, b, out rest);

            BigInteger nextBigInt;
            bool succeeded = BigInteger.TryParse(rest + "0", out nextBigInt);
            if (succeeded && (_loops < _maxIterations))
            {
                    _digitList.Add(value);
                    if (rest > 0)
                    {
                        CalcDivision(nextBigInt, b); /// andernfalls weitersuchen
                    }
                    else
                    {
                        printResult();
                    }
            }
            else
            {
                Console.WriteLine("Try Parse Not Succeeded  or _loops >= _maxIterations, Result:  ");
                printResult();    
            }
        }

        /// <summary>
        /// Visuelle Ausgabe des errechneten Golden Schnitt
        /// </summary>
        private void printResult()
        {
            int x = 0;
            int lineDigits = 0;
            bool firstline = true;
            Console.WriteLine("");
            foreach (BigInteger bI in _digitList)
            {
                if (firstline == true && lineDigits == 60)
                {
                    Console.Write("\n  ");
                    lineDigits = 0;
                    firstline = false;
                }

                if (lineDigits == 61)
                {
                    Console.Write("\n  ");
                    lineDigits = 0;
                }
                    
                if (x == 1)
                {
                    Console.Write(",");
                    Console.Write(bI);
                }
                else
                {
                    Console.Write(bI);
                }
                x++;
                lineDigits++;
            }
        }


26.10.2011 - 12:00 Uhr

Geeigneter sind Reihenentwicklungen. Z.B.

Hi Gü,

habe jetzt mal mit der Reihe versucht:


List<BigInteger> digitList = new List<BigInteger>();
BigInteger _maxIterations = 10000;
int _loops = 0;

BigInteger A = (BigInteger)13;
BigInteger B = (BigInteger)8;
BigInteger C = (BigInteger)((BigInteger)(Math.Pow(-1, n + 1)) * Faculty((2 * n + 1)));
BigInteger D = (BigInteger)(Faculty((n + 2)) * Faculty(n) * (BigInteger)Math.Pow(4, 2 * n + 3));

// Größter Gemeinsamer Teiler
BigInteger ggT = Get_ggT(B, D);
// Kleinstes Gemeinsames Vielfaches
BigInteger kgV = Get_kgV(B, D);

Bruch bruch1 = new Bruch(A, B);
Bruch bruch2 = new Bruch(C, D);
BigInteger ErgebnisNenner = Get_kgV(bruch1.nenner(), bruch2.nenner());
BigInteger ErgebnisZaehler = bruch1.zaehler() * (ErgebnisNenner / bruch1.nenner()) +
                    bruch2.zaehler() * (ErgebnisNenner / bruch2.nenner());

calcBruch(ErgebnisZaehler, ErgebnisNenner);

            private void calcBruch(BigInteger a, BigInteger b)
            {
                BigInteger rest;
                BigInteger value = BigInteger.DivRem(a, b, out rest);
                if (rest == 0 || (_loops >= _maxIterations)) // Wenn Rest = 0 oder max Anzahl Durchläufe erreicht
                {
                    int x = 0;
                    Console.WriteLine("");
                    foreach (BigInteger bI in digitList)
                    {
                        if (x == 1)
                            Console.Write(",");
                        Console.Write(bI);
                        x++;
                    }
                } 
                else
                {
                    BigInteger nextBigInt;
                    bool succeeded = BigInteger.TryParse(rest + "0", out nextBigInt);
                    if (succeeded && (_loops < _maxIterations))
                    {
                        digitList.Add(value);
                        _loops++;
                        calcBruch(nextBigInt,b); /// andernfalls weitersuchen
                    }
                }
            }

ergibt folgendes ergebnis für:
n= 1: 1,625976562
n= 2: 1,62484741210937
n= 3: 1,62502670288085937
n= 4: 1,624994993209838867187
n= 5: 1,625000983476638793945312
usw..

Also nicht annähernd 1,61803398874989 ...

In dieser Form kann ich auch nur bis n = 254 berechnen bevor ich ein Overflow bekomme.
🙁

aber du kannst die Summe konvergieren lassen

Das fehlt mir wahrscheinlich noch?

Danke

19.10.2011 - 17:16 Uhr

reine Spielerei... 😁 konkret brauch ich die Zahlen um die schwarzen löcher dieses Mystery Geocache hier zu lösen , den ich ja eigentlich schon gelöst habe (weil mit erstellt und versteckt), aber eben nur mit einer im Internet gefunden.

Da ich im Alltag nicht allzu viel mit Programmierung zu tun habe (sei denn man bezeichnet C/AL als Programmiersprache ....) suche ich mir immer irgendwelche Aufgaben / Projekte raus und versuche die zu lösen, bei dem Recherchen und rumprobiererei bleibt dann immer ein bisschen was hängen, und oft passiert dann das aus dem gedachten Einzeiler eine unendliche Geschichte wird , wie jetzt ... aber auch wenn ich noch nichts erreicht habe mit dem Beispiel so hat es mir doch schon das ein oder andere näher gebracht. Falls ich dann mal was produktiveres programmieren möchte dann kommen schonmal Gedanken wie: "ah, da hab ich doch mal dies oder das gesehen"...

Werd dann mal weiter versuchen mit dein neuen Ansatz versuchen.

Danke

19.10.2011 - 16:03 Uhr

Hi,

danke für eure Antworten.

Wenn ich manchmal über die eine oder andere Mathematik stolpere frage ich mich wo ich damals in der Schule gewesen bin 8o ... Auf jedenfall haben mich eure Antworten irgendwie zum Kettenbruch geführt, und nachdem ich es auch hinbekommen habe einen solchen Bruch programmiertechnisch darzustellen , sah ich mich wieder in einer Sackgasse X(

Also den nächsten Begriff geschnappt, BigInteger und damit angefangen zu recherchieren und zu suchen was man damit alles anstellen kann, bin dann hier über einen Pi Calculator gestolpert, muss leider gestehen das mir dies "zu hoch" ist, wird zwar schön erklärt, aber mein englsich ist nicht so gut, und ich nicht wirklich verstehe was dort abgeht. Da ich aber experimentierfreudig bin habe ich dieses Programm einfach mal mit folgenden Parametern gestartet:


xB.ArcTan(10946, 6765); // Fibonacci Zahlen an 21.22. Stelle
Console.WriteLine(xB.Print());

Dies ergab eine Ausgabe von: 1,61803398673677100674....

Also nur eine geringe Abweichung von dem was

double phi = ((1 + (double)Math.Sqrt(5)) / 2);
// phi = 1,61803398874989

ausgibt.

Sofern die phi Liste hier richtig ist, beginnt die ungenauigkeit des Pi Calculator an neunter Stelle.

Scheint ja irgendwie in die Richtige Richtung zu gehen? Wie könnte ich das jetzt modifizieren damit ich genauer an das Ergebnis komme?

Danke.

18.10.2011 - 13:20 Uhr

Hi,

ich möchte eine Ausgabe des Goldenen Schnitt mit 99 Nachkommastellen.

Habe mir gedacht das ist eine einfache Sache und die Formel angewendet:

double phi = ((1 + (double)Math.Sqrt(5)) / 2);

die Ausgabe ist: 1,61803398874989

leuchtet mir auch ein warum, double hat eine Genauigkeit von 15-16 Stellen ...

Mir wurde nahegelegt mit Epsilon zu arbeiten, und das eine präzision von 99 nachkommastellen
epsilon < 10^-99 entsprechen würde, mir leuchtet aber noch nicht ein was und wie ich mit epsilon vergleichen soll wenn doch der wert den ich habe ein double ist und schon gar nicht wie ich von da auf eine Ausgabe von 99 Nachkommastellen komme.

Wie schaffe ich jetzt eine visuelle Ausgabe der ersten 99 Nachkommastellen?

Muss ich dafür eine eigene Methode implementieren? Wenn ich eine Wurzel von 5 mit dem Windows Taschenrechner(Wissenschaftlich) ziehe erhalte ich 31 Nachkommastellen, fehlen mir noch 68 😉 demnach geht das irgendwie 😃 nur wie?

Danke.

05.10.2011 - 16:28 Uhr

Hoi,

an dieser Stelle auch mal ein dickes Danke von mir für das tolle Forum, bin zwar nicht so aktiv, aber sehr passiv und hole mir hier viele brauchbare Infos die ich für meine Hobby Programmiererei brauche... grad auch wieder auf der Suche bin ... 😉 Leider ist C# nicht wirklich Bestandteil meines Alltages , so findet es nur gelegentlich Anwendung , aber wird schon besser und ich lerne doch hier und da was dazu.

Mein Nickname ist spanisch und bedeutet "kleiner Stier" , den Kosename bekam mein letzter Wagen (R.I.P) nachdem mir ein Stoffstier Stierchen für die Hutablage geschenkt wurde damit ich den in Spanien wohnenden Teil meiner Family nicht vergesse 😃

16.06.2011 - 16:49 Uhr

Hi Bugrick,

mir gefällt deine LED Anzeige sehr gut, ich würde diese gerne verwenden um eine Anwendung zu entwickeln mit der man "Rennzeiten" erfassen kann. Damit wir bei unseren MTB Fun Rennen folgende Methode sparen 😃

Ich hoffe du hast nichts dagegen. Vielen Dank.

06.06.2011 - 10:31 Uhr

Hallo Tom,

danke für den Hinweis, hab mich an Wincor Nixdorf gewendet und prompt eine Antwort samt Spezifikation bekommen.

Vielen Dank.

06.06.2011 - 08:51 Uhr

Hi,

wir haben 2 Kartenterminals welche sich mit O.P.I. oder ZVT ansteuern lassen, da es sich bei O.P.I. um eine XML basierte Schnittstelle handelt würde ich diese bevorzugen.

Mein Problem ist das ich keine Beschreibung für diese Schnittstelle finde, nicht einmal ein XML Schema, habe auch schon den Terminal Hersteller und den Terminal Lieferant angeschrieben, aber es kam noch nichts bei rum. Vielleicht kennt von euch jemand die Schnittstelle und kann mir sagen wo ich mehr Infos dazu bekomme.

Vielen Dank.
elTorito

13.05.2011 - 14:36 Uhr

Okay kapiert... Hab das jetzt mal versucht auszutricksen, das klappt auch, aber Performance ist anders, durch das Workaround verzögert sich meine "Hit" Abfrage und dadurch das Neuzeichnen des Hover Effekt.


        //==========================================================================
        /// <summary>
        ///    Führt eine Zustandsänderung durch und stößt das Neuzeichnen an.
        /// </summary>
        protected void NewFormMouseMove(Object objSender, MouseEventArgs e)
        {
            int myY = e.Y;
            int myX = e.X;
            int intRefMax = 32767;
            int intRefMin = -32768;

            if ((myY >= intRefMin) && (myY < 0))
            {
                myY = intRefMax + (intRefMax + e.Y);
            }
            Point myPoint = new Point(myX,myY);

            
            base.OnMouseMove(e);
            for (int i = _newGraphicObjects.Count - 1; i >= 0; i--)
            {
                MyNewGraphicObject go = _newGraphicObjects[i];
                if (go.Contains(myPoint)) // Hit innerhalb  
                {
                    
                    // Hover = ja 
                    go.Hovered = true;
                    break;
                }
                else
                {
                    go.Hovered = false;
                }
            }

            // Maus Position in Label anzeigen 
            _lastMouseLocation = e.Location;
            _lblMouseLocation.Text = string.Format("Mouse Location: x = {0}; y= {1}", e.X, e.Y);
            _lblmyNewPosition.Text = string.Format("myPoint Location: x = {0}; y= {1}", myPoint.X, myPoint.Y);
            
            
            //-----------------------------------------------------------------------
            // Neuzeichnen anstoßen
            //-----------------------------------------------------------------------
            this.UserControl.Invalidate();
        }

13.05.2011 - 10:16 Uhr

Guten Morgen,
Freitag der 13te ... und wieder ein hübsches Problem wo ich nicht weiß wo ich ansetzen kann ... Habe eine Ahnung wo ran es liegen könnte , aber nicht was dazu führt. Und zwar bekomme ich die Mouse Location.Y bis 32.768 zurück, wenn ich dann die Maus weiter runter bewege geht die Mouse Location.Y rückwärts weiter... also:
0
bis
32.766
32.767
-32.768
-32.767
-32.766

Diese genaue Zahl lässt vermuten das irgendwo was mit den Integer Wert nicht stimmt, nur was?

Folgendes mache ich:

In meiner Form habe ich Panel , in diesem Panel hänge ich ein UserControl rein.
In diesem User Control zeichne ich die Bilder und Checkboxen.

Das Panel ist Auto Scroll = True, und Auto Size = true, das User Control ist AutoSize = false und AutoScroll = false.

Bevor ich das UserControl dem Panel adde berechne ich anhand der Anzahl Bilder wie groß es sein muss , wenn ein Bild/GrafikObjekt eine Breite von 145 hat, dann brauche ich bei 1.771 Bilder, 443 Zeilen, das macht eine Höhe von 53.160 Pixel, die Grafiken werden alle gezeichnet und ich kann bis zur letzten Runterscrollen.

Nachdem UserControl.Paint weise ich den MouseMove Event zu:
UserControl.MouseMove += FormMouseMove

Hier mache ich dann nichts weiteres als:


        //==========================================================================
        /// <summary>
        ///    Führt eine Zustandsänderung durch und stößt das Neuzeichnen an.
        /// </summary>
        protected void FormMouseMove(Object objSender, MouseEventArgs e)
        {
            base.OnMouseMove(e);
            for (int i = _GraphicObjects.Count - 1; i >= 0; i--)
            {
                MyNewGraphicObject go = _GraphicObjects[i];
                if (go.Contains(e.Location)) // Hit innerhalb  
                {
                    go.Hovered = true;
                    break;
                }
                else
                {
                    go.Hovered = false;
                }
            }

            // Maus Position in Label anzeigen 
            _lastMouseLocation = e.Location;
            _lblMouseLocation.Text = string.Format("x = {0}; y= {1}", e.X, e.Y);

            //-----------------------------------------------------------------------
            // Neuzeichnen anstoßen
            //-----------------------------------------------------------------------
            this.UserControl.Invalidate();
        }

Und hier läuft e.Y irgendwann ins Minus 😦

Danke

12.05.2011 - 19:56 Uhr

Hi,

der vorletzte Parameter heißt doch laut MSDN 'focused' (und nicht 'clicked').
Also einfach immer auf 'false' setzen (außer du willst explizit den Focus für eine aktive CheckBox setzen...)

👍

*kopf gegen Wand* 😁 Daran hat es gelegen. Vielen Dank.

12.05.2011 - 15:36 Uhr

Hallo Herbivore,

habs hinbekommen dank eurer Super Tutorials . Dennoch quält mich noch eine Frage.
In CheckBoxRenderer-Klasse gibt es eine CustomCheckBox Klasse wo OnPaint überschrieben wird, aber letztendlich die CheckBox mit Controls.Add(CheckBox1) ins Form gehängt wird. Hätte ich diese Klasse so benutzt , wäre ich wahrscheinlich wieder in die "zu viele Controls Falle" geraten?

Mit euren Tutorials habe ich nun rumgetüfftelt und denke ein ganz brauchbares Ergebnis erzielt.

Eine Kleinigkeit aber stört mich noch, wenn ich nun ein GrafikObjekt anklicke, setzt sich ein feiner gepunkteter Rahmen um das GrafikObjekt. (Siehe Anhang). Wie kann ich das wegbekommen?

Hat was mit dem Focus zu tun?

Gezeichnet wird wie folgt:


    public override void Draw(Graphics g)
    {
        // Clicked und Hovered behandeln und dementsprechend CheckBoxState und Brush setzen
        HandleMouseEvents();
        // Rectangle füllen mit je nachdem was bei HandleMouseEvents gesetzt wurde
        g.FillRectangle(_brush, _rect);
        // Prüfen wann und ob die CheckBox gezeichnet werden soll  
        if ((!Clicked && Hovered) || Clicked) 
        CheckBoxRenderer.DrawCheckBox(g,
                                          _rect.Location,
                                          _rect,
                                          "",
                                          SystemFonts.IconTitleFont,
                                          TextFormatFlags.HorizontalCenter,
                                          Clicked, MyCheckBoxState);



    }

Vielen Dank!
elTorito

09.05.2011 - 17:47 Uhr

Hallo herbivore,

danke für den Hinweis. Habe jetzt eine CustomPictureBox welche mir die Bilder malt:

    class CustomPictureBox : System.Windows.Forms.PictureBox
    {
        public string FileName
        {
            get;
            set;
        }

        public Image ImageFromBilderListe
        {
            get;
            set;
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs pe)
        {
            if (this.Image == null)
                //this.Image = Bitmap.FromFile(FileName);
                this.Image = ImageFromBilderListe;
            base.OnPaint(pe);
        }
    }

Damit geht gleich alles viel flüssiger 😃

Bevor es weiter geht tät mich noch eine Sache interessieren (Siehe Anhang,
Screenshot vom Win7 Foto Import Assistent)

Wie könnte man das nachprogrammieren?

Ist das eine Checkbox mit Bilder? Eine PictureBox die über eine Checkbox liegt? Beim MousOver zeichnet sich ein Rahmen um das Bild und macht die CheckBox sichtbar (sofern unchecked ist), wird hier beim MouseOver ein Hintergrundbild geladen, oder kann das auch Programmiert werden?

Wenn ich jetzt nicht ganz falsch liege dann muss ich mir ein Control schreiben welches so ein Bild mit CheckBox "ausspuckt"? Würde gerne wissen was ich dafür alles verwenden muss. Statt wie oben eine PictureBox, ableiten von eine CheckBox?

Oder wie würdet Ihr das Szenario nachstellen?

Danke

03.05.2011 - 14:25 Uhr

Hi,

ich hab mich mal wieder diesem Projekt gewidtmet 🙂

Sieht nun so aus:

Ich habe eine Klasse ImageFolder, diese geht Rekursiv durch die Unterverzeichnisse eines angegebenen Pfades, wendet einen Filter an und gibt mir alle Dateien vom typ Bild zurück gibt und speichert diese in eine ArrayList.

Nun habe ich eine Liste mit sämtlichen brauchbaren Dateiendungen und weiß wie viele Bilder geladen werden müssen.

Nun starte ich einen Backgroundworker und übergebe diesem meine ArrayList mit den Dateinamen. Es öffnet sich ein Neues Form mit Ladebalken , dieser läuft durch während ich Thumbnails von den Bildern erstelle um damit ein BildModel zu generieren.

Sobald ein BildModel fertig ist wird es zu einer BildModelListe hinzugefügt. Nun habe ich eine Liste mit allen Bildern und Daten die ich zur Anzeige brauche.

Bis hier hin funktioniert alles Super, auch mit 2000 Bildern ziemlich flüssig.

Und jetzt häng ich wieder... 😁 Ich weiß nicht wie ich die Bilder flüssig in ein Panel dargestellt bekomme.


// Hier gehts los ... 
ImageFolder myImagefolder = new ImageFolder(folderBrowseDialog1.SelectedPath);

// Wenn Backgroundworker durch bekomme ich eine List<BildModel> BildModelListe zurück
bilderListe = myImagefolder.BildModelListe; // Liste von Bilder Objekten

// Controls erstellen
CreateControlsForGui(bilderListe);

// Controls zeichnen
foreach (GroupBox gb in myGroupBoxes)
{
    // GrouBoxes dem Panel hinzufügen
    listFlowLayoutPanel.Controls.Add(gb);
}

this.ResumeLayout(false);



        private void CreateControlsForGui(List<BildModel> bilderListe)
        {
            int xy = 0;
            // Für jedes Objekt in bilderListe PictureBox mit Thumb erstellen und checkbox dran hängen
            foreach (BildModel bm in bilderListe)
            {
                PictureBox pb = new PictureBox();
                pb.Size = new System.Drawing.Size(Properties.Settings.Default.ThumbnailSize, Properties.Settings.Default.ThumbnailSize);
                pb.Location = new System.Drawing.Point(10, 10);
                pb.Image = bm.myImageInBildModel;
                pb.Name = bm.BildIndex.ToString();


                CheckBox cb = new CheckBox();
                cb.Location = new System.Drawing.Point(100 - 16, 8);
                cb.Size = new Size(14, 14);
                cb.FlatStyle = FlatStyle.System;
                cb.Name = bm.BildIndex.ToString();
                cb.BackColor = Color.Transparent;

                // BildEigenschaft in BildModel setzen
                cb.CheckedChanged += new EventHandler(CheckBoxChanged);
                cb.BringToFront();

                GroupBox gb = new GroupBox();
                gb.Width = 100;
                gb.Height = 100;
                // Set the FlatStyle of the GroupBox.
                gb.FlatStyle = FlatStyle.Flat;
                gb.Controls.Add(cb);
                gb.Controls.Add(pb);
                gb.Name = bm.BildIndex.ToString();

                myGroupBoxes.Add(gb);
                xy++;
            }                 
        }

Das funktioniert flüssig mit bis zu 400 Bildern, mit 2000 Bildern friert die GUI ein, die FAQ dafür versuche ich gerade zu verstehen...

Meine Anwendung hat nur ein Form, diesem wird zur Laufzeit ein FlowLayoutPanel hinzugefügt und ein Button mit dem ich quasi das Programm starte (Folderdialog aufrufen, Übergabe an meine HoleMirDateien Klasse, Starte BackgroundWorker, gebe mir eine BildModelListe zurück...

Um zu verstehen wo ich jetzt ansetzen muss versuch ich mal mit folgender Frage:

Muss ich schon im Backgroundworker die Controls nach und nach zeichnen? Würde das heißen ich müsste mit Threads arbeiten? (Einer der weiter die Bilder der BildListe hinzufügt, und einer der schon anfängt diese auf der Gui darzustellen?)

Oder kann ich mit meiner BilderListe (in der ja schon alles geladen und vorhanden ist ) irgendwie weiterarbeiten? Ich hatte gedacht wenn ich alle Infos und Thumbnails in meiner BildListe habe das ich im Anschluss alles zügig darstellen könnte, fehl gedacht 🙁

So Spontan ohne weiter nachzudenken würde ich ja für die Darstellung erneut ein Backgroundworker laufen lassen, aber irgendwie doof, weil ja eigentlich schon alles da sein sollte.

Danke euch für weitere Denkanstöße

13.04.2011 - 15:19 Uhr

Hallo Herbivore,

vielen Dank für deine Antworten.

Mein Ziel ist es mehrere ChildFormulare offen zu haben, jedes mit eigenem DataGridview welches über den BindingNavigator im MDI Parent gesteuert wird.

Das funktioniert jetzt. 😁

Ich habe folgendes gemacht:

  1. Eine Klasse geschrieben welche mir die BindingSource zur Verfügung stellt:

class DBConnect
    {

        private BindingSource bindingSource1 = new BindingSource();
        private SqlDataAdapter dataAdapter = new SqlDataAdapter();

        
        public DBConnect(string constring)
        {
            GetData(constring);
            bdSrce = bindingSource1;
        }

        public BindingSource bdSrce
        {
            get;
            set;
        }

        private void GetData(string selectCommand)
        {
            try
            {
                // Specify a connection string. Replace the given value with a 
                // valid connection string for a Northwind SQL Server sample
                // database accessible to your system.
                String connectionString = @"Data Source=.\SQLEXPRESSPKA;Initial Catalog=myTable;Integrated Security=True";

                // Create a new data adapter based on the specified query.
                dataAdapter = new SqlDataAdapter(selectCommand, connectionString);

                // Create a command builder to generate SQL update, insert, and
                // delete commands based on selectCommand. These are used to
                // update the database.
                SqlCommandBuilder commandBuilder = new SqlCommandBuilder(dataAdapter);

                // Populate a new data table and bind it to the BindingSource.
                DataTable table = new DataTable();
                table.Locale = System.Globalization.CultureInfo.InvariantCulture;
                dataAdapter.Fill(table);
                bindingSource1.DataSource = table;

            }
            catch (SqlException)
            {
                MessageBox.Show("To run this example, replace the value of the " +
                    "connectionString variable with a connection string that is " +
                    "valid for your system.");
            }
        }
    }

Im Child Form hole ich mir die BindingSource und binde diese an mein vorhandenes DataGridView :


        private void frmChild_Load(object sender, EventArgs e)
        {
            DBConnect myDBCon = new DBConnect("select * from Type");
            bindingSource1 = myDBCon.bdSrce;
            dataGridView1.DataSource = bindingSource1;
        }

Dann habe ich in meine ChildForm Klasse folgende Klasse implementiert:


        public class BindingSourceEventArgs : EventArgs
        {
            public BindingSourceEventArgs(BindingSource bindingSource1)
            {
                BindingSource1 = bindingSource1;
            }

            public BindingSource BindingSource1 { get; set; }// Bindingsource als  Eigenschaft definieren
        }

Hier wird dann ein Eventhandler zur Verfügung gestellt:


        public event EventHandler<BindingSourceEventArgs> UpdateNavigator; // Ereignis deklarieren
        protected virtual void OnUpdateBindingNavigator(BindingSourceEventArgs e)
        {
            EventHandler<BindingSourceEventArgs> ev = UpdateNavigator;
            if (ev != null)
                ev(this, e); // abonnierte Ereignismethode(n) aufrufen
        }

den ich beim aktivieren des Child Form auslöse:


        private void childForm_Activated(object sender, EventArgs e)
        {
            OnUpdateBindingNavigator(new BindingSourceEventArgs(bindingSource1)); // Ereignis-Methode aufrufen
        }

Im MDI Main Form erfolgt dann folgender Aufruf:


                // Child Form als Single Instanz öffnen und in Vordergrund bringen
                childForm objChildFrm = childForm.GetChildInstance();
                objChildFrm.MdiParent = this;
                objChildFrm.UpdateNavigator += UpdateBindingNavigator; // Ereignis abonnieren
                objChildFrm.Show();

folgende Methode binden die BindingSource an meinen im Main vorhandenen Navigator:


        void UpdateBindingNavigator2(object sender, childForm.BindingSourceEventArgs e)
        {
            // DataSource an BindingNavigator binden
            bindingNavigator1.BindingSource = e.BindingSource1;  // Zugriff auf Eigenschaft des Ereignisses          
        }

Schön oder? 😉

So, das hat mich auf die Idee gebracht das ich auch nur ein childForm benötige, sonst häufen sich wohl die Forms an.

Dafür habe ich im childForm folgende EIgenschaft erstellt:


 private string connString;        
 public string SchreibeConnString
        {
            set { this.connString= value; }
        }

im childForm OnLoad:


        private void childForm_Load(object sender, EventArgs e)
        {
            DBConnect myDBCon = new DBConnect(connString);
            bindingSource1 = myDBCon.bdSrce;
            dataGridView1.DataSource = bindingSource1;   
        }

im MDI rufe ich das ChildForm dann so auf:


                childForm objChildFrm = childForm.GetChildInstance();                
                objChildForm.MdiParent = this;
                objChildForm.SchreibeConnString = "select * from Type";
                objChildForm.UpdateNavigator += UpdateBindingNavigator2; // Ereignis abonnieren
                objfrmSubTypeList2.Show();

Das funktioniert logischerweise nicht weil ich das childForm als SIngle Instanz festnagel.

Erlaube ich mehrere Instanzen des childs:


                ChildForm objChildForm= new ChildForm ();
                objChildForm.MdiParent = this;
                objChildForm.SchreibeConnString = "select * from Type";
                objChildForm.UpdateNavigator += UpdateBindingNavigator2; // Ereignis abonnieren
                objfrmSubTypeList2.Show();

Funktioniert das wunderbar, mit einer Form kann ich x beliebigen sql String ausgeben lassen. Nun ist es natürlich doof das ich mehrere gleiche Forms offen haben kann.

Ist es möglich mit nur einem Form mehrere childForms zu erzeugen?, wahrscheinlich durch Übergabe eines Parameters den ich beim Klick auf meinen TreeViewe definiere? (EDIT: Habs hiermit gelöst, gehe einfach den Array der ChildForms durch , passt, mal schauen wo ich als nächstes hängen bleibe )

Ist der Ansatz oben für das aktualisieren des DataNavigator eigentlich okay?

Danke

gruß
elTorito

12.04.2011 - 16:18 Uhr

Hallo Herbivore,

die Redundanz soll auf jedenfall noch weg 😃 Wollte nur "mal eben" was ausprobieren" ...

Ich hab mir jetzt mal eine Methode GetData geschrieben welche sich die Datensätze holt.

du erstellst jedes mal ein neues DataGridVie

ja, stimmt, wurde jedesmal ein Contorls.Add ausgeführt. Da ich jetzt nicht wusste wie ich abfragen kann ob das DataGridView schon existiert habe ich folgendes probiert:

Das DataGridView per Drag & Drop in mein Child Formular eingefügt (das sollte ausschließen das es neu erstellt und ein evtl. vorhandenes in den Hintergrund stellt?)

An das Child Formular übergebe ich die BindingSource, im Load Event des Child Form weise ich dem DataGridView die BindingSource zu.

Anschließend wird im MDI Parent Form die BindingSource an den BindingNavigator geknüpft.

Nun hab ich die gleichen Symptome wie oben schon beschrieben(Punkt 1.,2.,3.) und weiß wieder nicht weiter 😦

Mein Ziel ist es mehrere ChildFormulare offen zu haben, jedes mit eigenem DataGridview welches über den BindingNavigator im MDI Parent gesteuert wird.

Auch ohne Klick auf meine Knotenstruktur (also sobald ein Child ein Focus bekommt) soll sich die BindingSource an den BindingNavigator binden.

Ich versuch mal ein Lösungsansatz:

Klasse schreiben welche sich um das holen der Datensätze kümmert und eine BindingSource zur Verfügung stellt, aus dem Child Form die BindingSource an den MDI Parent BindingNaviagtor knüpfen.

Würde ich so versuchen, wenn ich nicht gelesen hätte das dem Child Form nicht zu interessieren hat welche Objekte das MDI Parent beinhaltet. hmm.

Ich steh aufm Schlauch , mal 2 Kaffee weiter drüber nachdenken.

Danke

11.04.2011 - 15:22 Uhr

Hi,

meine MDI Anwendung öffnet aus einem TreeView heraus Child Fenster, in den Child Fenster lasse ich Daten aus einer SQL DB anzeigen.

Meinem MDI Haupt Form habe ich per Drag & Drop ein BindingNavigator Element hinzugefügt, wenn ich auf einem Tree Knoten klicke öffnet sich ein Fenster mit den passenden Daten. Durch diese kann ich mit dem Bindingnavigator navigieren (vor/zurück, erster/letzter usw)

Mein Problem ist das "irgendwo der Focus verloren" geht , das macht sich wie folgt bemerkbar:

  1. Ich klicke den ersten Knoten an, das Child öffnet sich, im BindingNavigator wird korrekt Datensatz 1 von 17 angezeigt, ein Klick auf die Vor/zurücktasten markieren den passenden Datensatz.

  2. Ich klicke den zweiten Knoten , das Child Fenster öffnet sich, im BindingNavigator wird nun korrekt Datensatz 1 von 22 angezeigt , ein klick auf Vor/Zurück markiert auch hier den passenden Datensatz.

  3. Klicke ich nun wieder auf den ersten Knoten, aktualisiert der BindingNavigator sich (mit 1 von 17 Datensätzen), wenn ich vor/zurück Pfeiltasten klicke, ändert sich auch die Nummer x von 17, aber im Child Form passiert nichts mehr, dort bleibt der letzte Datensatz markiert welche ausgewählt war als das Child den Focus verlor.

Wo könnte ich einen Lösungsansatz finden?

Danke!


            if (e.Node.Text == "Node2")
            {

                // CHild Form als SIngle Instanz öffnen und in Vordergrund bringen
                frmTypeList1 objfrmTypeList1 = frmTypeList1.GetChildInstance();
                objfrmTypeList1.MdiParent = this;
                objfrmTypeList1.Show();
                objfrmTypeList1.BringToFront();

                // SQL Connection - muss noch woandershin, eigene Klasse oder so ... 
                SqlConnection myConn = new SqlConnection(@"Data Source=.\SQLEXPRESSPKA;Initial Catalog=meineDB;Integrated Security=True");
                myConn.Open();
                SqlCommand query = new SqlCommand("SELECT * from Type", myConn);
                SqlDataAdapter adrQuery = new SqlDataAdapter(query);
               
                // DataSet erstellen und füllen
                DataSet dsQuery = new DataSet();
                adrQuery.Fill(dsQuery);                
                
                BindingSource _bindsrc = new BindingSource();
                _bindsrc.DataSource = dsQuery;
                _bindsrc.DataMember = dsQuery.Tables[0].TableName;

                // DataSource an BindingNavigator binden
                bindingNavigator1.BindingSource = _bindsrc;

               //DataGridView erstellen
                DataGridView mydatagridView = new DataGridView();
                mydatagridView.Name = "dataGridView1";

                mydatagridView.DataSource = _bindsrc;
                objfrmTypeList1.Controls.Add(mydatagridView);
                myConn.Close();
            }

            if (e.Node.Text == "Node3")
            {

                // CHild Form als SIngle Instanz öffnen und in Vordergrund bringen
                frmList2Subtype objfrmSubTypeList2 = frmList2Subtype.GetChildInstance();
                objfrmSubTypeList2.MdiParent = this;
                objfrmSubTypeList2.Show();
                objfrmSubTypeList2.BringToFront();

                // SQL Connection - muss noch woandershin, eigene Klasse oder so ... 
                SqlConnection myConn = new SqlConnection(@"Data Source=.\SQLEXPRESSPKA;Initial Catalog=meineDB;Integrated Security=True");
                myConn.Open();
                SqlCommand query = new SqlCommand("SELECT * from SubType", myConn);
                SqlDataAdapter adrQuery = new SqlDataAdapter(query);
                // DataSet erstellen und füllen
                DataSet dsQuery = new DataSet();
                adrQuery.Fill(dsQuery);

                BindingSource _bindsrc = new BindingSource();
                _bindsrc.DataSource = dsQuery;
                _bindsrc.DataMember = dsQuery.Tables[0].TableName;

                // DataSource an BindingNavigator binden
                bindingNavigator1.BindingSource = _bindsrc;

                //DataGridView erstellen
                DataGridView mydatagridView = new DataGridView();
                mydatagridView.Name = "dataGridView1";

                mydatagridView.DataSource = _bindsrc;
                objfrmSubTypeList2.Controls.Add(mydatagridView);
                myConn.Close();
            }

Die Fnc GetChildInstance sieht so aus:


        public static frmList2Subtype GetChildInstance()
        {
            if (m_SChildform == null) //wenn nicht vorhanden, Instanz erstellen

                m_SChildform = new frmList2Subtype();
            return m_SChildform;  //neu erstellte oder schon vorhandene Instanz zurückgeben

        }
18.11.2010 - 05:17 Uhr

hast du keine realeren Problemstellungen zum Üben?

tjoa ich weiß auch nicht warum ich es mir immer so kompliziert machen muss 😉

Das mit der Matrix hab ich jetzt nicht ganz verstanden , ich hab meine "matrix" mal so aufgebaut:


        private int[,] matrix = {
                                    {3,1,4,1,5,9,2,6,5,3,5,8,9,7},
                                    {9,3,2,3,8,4,6,2,6,4,3,3,8,3},
                                    {2,7,9,5,0,2,8,8,4,1,9,7,1,6},
                                    {9,3,9,9,3,7,5,1,0,5,8,2,0,9},
                                      ....
                                    {7,4,9,5,6,7,3,5,1,8,8,5,7,5},
                                    {2,7,2,4,8,9,1,2,2,7,9,3,8,1},
                                    {8,3,0,1,1,9,4,9,1,2,9,8,3,3},
                                    {6,7,3,3,6,2,4,4,0,6,5,6,6,4}
                                };

Mein OnPaint sieht so aus:


        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g;

            //-----------------------------------------------------------------------
            // Es ist wichtig, dass wir (zuerst) die Oberklasse machen lassen.
            //-----------------------------------------------------------------------
            base.OnPaint(e);

            g = e.Graphics;

            int x = 0;
            int y = 100;

            int countField = 0;

            foreach (int nR in matrix)
            {
                x = x + 20;
                if (countField == 14)
                {
                    y = y + 20;
                    countField = 0;
                    x = 20;
                }
                countField += 1;
                g.DrawString(nR.ToString(), myfont, myBrush, x, y);

            }
        }

Das malt mir schonmal die Tabelle wie ich sie gerne hätte, aber ich glaube ich hab dich falsch verstanden , was die sache mit der Matrix angeht. Die Matrix aus System.Drawing.Drawing2D sollte ich verwenden?

Meine Matrix hätte dann 14 Spalten und 30 Zeilen .

Wenn treffer dann oben/unten/rechts/links usw... Und wenn treffer dann muss ich den treffer dann wegspeichern damit ich spaeter beim rezeichnen weiß welche zahlen in einer anderern Farbe müssen.

Morgen noch etwas experimentieren, genug für heute ...

Und danke für deine Antwort.
Gruß
Peter

18.11.2010 - 00:04 Uhr

Hallo,

ich habe mein anderes Projekt gerade mal kurz auf Eis gelegt bis ich das mit den Databindings richtig verstanden habe. Habe mir auch schon ein neues Projekt überlegt , aber kein Plan wie und ob man das realisieren kann, wahrscheinlich brauch man dafür ein ausgetüffelten Algorhytmus.

Also. Gegeben sei ein Teil der Zahl Pi dargestellt in einer Tabelle:

3 1 4 1 5 9 2 6 5 3 5 8 9 7
9 **3 ** 2 3 8 4 6 2 6 4 3 3 8 3
2 7 9 5 0 2 8 8 4 1 9 7 1 6
9 3 9 9 3 7 5 1 0 5 8 2 0 9
7 4 9 4 4 5 9 2 3 0 7 8 1 6
4 0 6 2 8 6 2 0 8 9 9 8 6 2
8 0 3 4 8 2 5 3 4 2 1 1 7 0
6 7 9 8 2 1 4 8 0 8 6 5 1 3
2 8 2 3 0 6 6 4 7 0 9 3 8 4
4 6 0 9 5 5 0 5 8 2 2 3 1 7
2 5 3 5 9 4 0 8 1 2 8 4 8 1
1 1 7 4 5 0 2 8 4 1 0 2 7 0
1 9 3 8 5 2 1 1 0 5 5 5 9 6
4 6 2 2 9 4 8 9 5 4 9 3 0 3
8 1 9 6 4 4 2 8 8 1 0 9 7 5
6 6 5 9 3 3 4 4 6 1 2 8 4 7
5 6 4 8 2 3 3 7 8 6 7 8 3 1
6 5 2 7 1 2 0 1 9 0 9 1 4 5
6 4 8 5 6 6 9 2 3 4 6 0 3 4
8 6 1 0 4 5 4 3 2 6 6 4 8 2
1 3 3 9 3 6 0 7 2 6 0 2 4 9
1 4 1 2 7 3 7 2 4 5 8 7 0 0
6 6 0 6 3 1 5 5 8 8 1 7 4 8
8 1 5 2 0 9 2 0 9 6 2 8 2 9
2 5 4 0 9 1 7 1 5 3 6 4 3 6
7 8 9 2 5 9 0 3 6 0 0 1 1 3
3 0 5 3 0 5 4 8 8 2 0 4 6 6
5 2 1 3 8 4 1 4 6 9 5 1 9 4
1 5 1 1 6 0 9 4 3 3 0 5 7 2
7 0 3 6 5 7 5 9 5 9 1 9 5 3
0 9 2 1 8 6 1 1 7 3 8 1 9 3
2 6 1 1 7 9 3 1 0 5 1 1 8 5
4 8 0 7 4 4 6 2 3 7 9 9 6 2
7 4 9 5 6 7 3 5 1 8 8 5 7 5
2 7 2 4 8 9 1 2 2 7 9 3 8 1
8 3 0 1 1 9 4 9 1 2 9 8 3 3
6 7 3 3 6 2 4 4 0 6 5 6 6 4

Nun möchte ich nach einer Zahlenreihenfolge suchen, die 543, oder 20919 oder 399 oder 9074(Fett markiert in der Tabelle)

Ich möchte das nach Eingabe der Zahl mein Ergebnis farblich hervorgehoben wird.

Kann man so etwas realisieren? Vertikal / Horizontal stelle ich mir leicht vor, angenommen jede Zeile /Spalte ist ein Array von Zahlen bzw. ein String müsste ich einfach diesen durchlaufen und suchen.

Kniffelig dürften die Schrägen und "um die Ecke" Ergebnisse sein ...

Von der Logik stelle ich mir das so vor das ich mit meiner Wunschzahl z.B.: 543 anfange die Tabelle durchzugehen, findet das Programm eine 5 muss es gucken ob oben/unten/rechts/links eine 4 ist, findet es eine 4 dann weiter mit der 3 ...

Nur wüsste ich gerade nicht wie ich meine Zahlen irgendwo hinterlegen könnte damit es so abläuft, und auch wüsste ich gerade nicht wie ich die Tabelle in ein Form oder was anderes abbilden könnte damit das Ergebnis hervorgehoben wird.

Vielleicht (falls es machbar sein sollte) könnt Ihr mir ein paar Tipps/Vorschläge/Denkanstöße geben.

Vielen Dank
Peter

17.11.2010 - 14:27 Uhr

Hallo Gü, und ERfinder des Rades, danke für eure Antworten,
versuche mich gerade in Data Bindings reinzulesen , hab hier auch noch eine deutsche Doku gefunden welche mir etwas leichter fällt zu lesen.

Was der WIndows XP Import Wizard macht? Meines erachtens nach nicht viel, siehe hier: Import von Kamerabilder auf Win XP

Derzeit läuft das ganze bei mir so ab , ich habe für jeden "Schritt" ein UserControl, diese werden beim Start alle geladen, in Abhängigkeit vom Schritt werden diese dann angezeigt.

Im ersten schritt suche ich mir mittels FolderBrowserDialog den Pfad zu den Bildern, mit der anzahl von Bildern generiere ich dann die PictureBoxex und CheckBoxen.

Mein Ereignishandler für CheckBox sieht nun so aus:


        // Eventhandler
        private void CheckboxChanged(object sender, EventArgs e) 
        {
            CheckBox checkbox = (CheckBox)sender;

            if (sender is CheckBox)
            {
                string checkedPic = ((System.Windows.Forms.CheckBox)sender).Tag.ToString();
                if (checkbox.Checked)
                {
                    _context.ImgList.Add(checkedPic);
                }
                else
                {
                    _context.ImgList.Remove(checkedPic);
                }
            }
            else
            {
                MessageBox.Show("Error");
            }

        }

Ausgewählte Bilder befinden sich also in IMGList, im nächsten Schritt gebe ich BildName und Zielverzeichnis ein, im letzten Schrit werden die Bilder dann gespeichert:


        private bool saveJpeg(string path, string imgFileName, string imgSrcFullPathName, int quality)
        {
            //create an object that we can use to examine an image file
            Image imgToSave = Image.FromFile(imgSrcFullPathName);

            //save the picture as a Jpeg        
            imgToSave.Save(path + "\\" + imgFileName, System.Drawing.Imaging.ImageFormat.Jpeg);

            imgToSave.Dispose();
            return true;
        }

Habs gerade mal mit 50 Bildern probiert, bis auf eine ruckelarzige darstellung der Picturebox gehts eigentlich recht zügig, aber Performance geht anders und schön ist das auch nicht anzusehen, ich muss das wohl noch mal paar Sachen überdenken.

Also Lösungsweg: Daten von der Benutzeroberfläche trennen und zur Anzeige Datenbindung verwenden... Dann weiß ich ja jetzt was ich zu tun habe...

Danke.
Peter

17.11.2010 - 00:29 Uhr

Hallo,

Dictionary ist mir noch gar nicht untergekommen, naja, beim recherchieren,... aber die < > Klammern haben mir Angst gemacht X( Daher alles mit < > ignoriert bisher...

Habe eben gemerkt das der Weg über die Tag Eigenschaft mich dazu verführt hat eine List<T> anzulegen, weil es scheinbar nicht möglich ist einem Array ohne feste länge etwas zuzuweisen. Toll und schon haben mich die < > Klammern ...

Ich hatte erst vor den Index der CheckBox abzugreifen und damit dann den Bilder Array durchzulaufen um alle Bilder rauszuschmeißen welche nicht angecheckt wurden.

Da ich nur die Bildernamen brauche, mit Ursprungspfad, habe ich mir jetzt eine List<T> als String genommen, dort füge ich die BildNamen mit Add hinzu...

Löse ein problem und man bekommt drei neue... was mach ich denn wenn die CheckBox wieder abgekreuzt wird, dann muss ich die Liste durchsuchen und den Löschen, oder anhand von Index Löschen... Auf gehts ...

Danke.

16.11.2010 - 23:53 Uhr

Hallo Michael ,

das Problem ist wohl dass du bei deiner CheckBox das Tag nicht gesetzt hast.
Michael

das wollte ich gerade schreiben 😉 Habe das ganze Szenario nochmal für ein Click auf die PictureBox gemacht und da hat es funktioniert, dann bin ich nochmal den Code durchgegangen und hab dann gesehen das CheckBox.Tag nicht gesetzt war . Vielen Dank für deine Hilfe und Gute Nacht

Peter

16.11.2010 - 23:14 Uhr

Hallo Michael,

danke für die Antwort.

Es knallt bei


int chkIndex = (int)checkBox.Tag;

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Hab das in der tat nur dahin gepastet um zu gucken ob da überhaupt was passiert, bzw ich irgendeinen Zugriff habe.

Ich hab mir gerade folgendes überlegt, im EventHandler ist das Array chkArr ja bekannt, eigentlich müsste da ja ein :


            string message = string.Empty;
            for (int i = 0; i < chkArr.Length; i++)
            {
                if (chkArr[i].Checked)
                {
                    message = string.Format("boxes[{0}] is clicked\n", i);
                    MessageBox.Show(message);
                }
            }

auch schon etwas bringen, tut es aber auch nicht.


chkArr.Length.ToString());

gibt die passende Array Länge wieder.

Hab jetzt auch mal folgendes probiert:


            CheckBox checkbox = (CheckBox)sender;

            if (sender is CheckBox)
            {
                if (checkbox.Checked)
                {
                    checkbox.Text = "Checked";
                }
                else
                {
                    checkbox.Text = "UnChecked";
                }

                checkbox.Tag.ToString();
                MessageBox.Show(checkbox.Tag.ToString());
             
            }
            else
            {
                MessageBox.Show("Fehler");
            }

Hier knallt es bei


checkbox.Tag.ToString();

auch NullReference Exception

Ich glaube hier im Forum gelesen zu haben das jemand checkbox.Tag versucht hat anzuwenden auf Web.UI, und das das wohl nicht geht, meine Form wird abgeleitet von einem Wizard Schnippsel was ich mir zusammen gecodet habe, evtl gehts deswegen auch nicht?

Schwierige c# welt ...

Ich steh gerade echt aufn Schlauch 😦

Danke
Peter

PS: Link nachgetragen

Edit2:


int Index = Array.IndexOf<CheckBox>(chkArr, (CheckBox)sender);
MessageBox.Show(Index.ToString());

Gibt mir -1 als Ausgabe.

16.11.2010 - 21:41 Uhr

Hallo,

als eifriger Navision Programmierer möchte ich mich mal wieder C# widtmen, irgendwann muss das doch einfach mal in meinen Kopf reingehen... Hab hier einige Bücher liegen und das Internet, aber nun möchte ich doch mal wieder fragen.

Hab mir daher ein kleines Projekt ausgesucht, meine Mutter vermisst bei Windows 7 den Foto Import Assistenten von Windows XP, Sie kommt mit dem neuen einfach nicht klar. Also, guter Sohn wie ich bin :evil: hab ich mir gedacht programmier ich den alten Foto Assitenten nach...

Und zwar folgendes:

Ich lese Bilder ein, die Thumbnails werden in PictureBoxes im Panel dargestellt und die CheckBoxen darüber gelegt:


                        this.BackPanel.Controls.Add(chkArr[i]);
                        this.BackPanel.Controls.Add(pbxArr[i]);

Die Bilder speichere ich in einem Array:


// Array (imgName) mit Bilder aus verzeichnis füllen
imgName = Directory.GetFiles(fbd.SelectedPath, "*.jpg");
// Um später drauf zuzugreifen
_context.ImgName = imgName;

Die CheckBox bekommen ein Event Handler:


chkArr[i].CheckedChanged += new EventHandler(CheckboxChanged); 

Der wie folgt aussieht:


        // Ereignishandler 
        private void CheckboxChanged(object sender, EventArgs e) 
        {
            if (sender is CheckBox)
            {
                MessageBox.Show("sender ist ein checkbox objekt");
             /*
            CheckBox checkBox = (CheckBox)sender;
            int chkIndex = (int)checkBox.Tag;
            chkArr[chkIndex].Checked = !(chkArr[chkIndex].Checked || chkArr[chkIndex].Checked);
             * */
            }
            else
            {
                MessageBox.Show("Fehler");
            }

        }

Hier häng ich, also im EventHandler ist das Objekt da, ich dachte ich könnte mit dem auskommentierten Code weiterkommen, der läuft allerdings auf einen NullReference Fehler (hab ich hier nachgelesen, aber hilft mir auch nicht weiter), weil das Objekt ist doch da ?

Wie komme ich nun an den Index der Box die ich angeklickt habe? Mit dem Index möchte ich dann die angekreuzten Bilder aus imgName[] übernehmen.

Danke schonmal.
Peter

28.09.2009 - 10:58 Uhr

Hallo, und vielen Dank.
Die Antwort hat mir geholfen. Habe nun meine neue Spalte im DGV eingebunden nach aktualisieren das TableAdapter.

Gruß
Peter

25.09.2009 - 16:37 Uhr

Hallo,

mein Werkzeug: Visual C# 2008 Express

ich habe ein DataGridView, dort werden mir Datensätze aus einer Tabelle angezeigt (SQL CE Datenbank).

Nun habe ich die Tabelle modifiziert, ich habe eine Spalte hinzugefügt, diese wird im dataGridView aber nicht angezeigt.

Habe dann über das SmartTag des DataGridView Spalten bearbeiten ausgewaehlt und versucht meine neue Spalte hinzuzufügen, diese wird dort aber nicht angezeigt.

Dann habe ich versucht über den Datenbank Explorer Datenverbindung, Tabelle , Spalten zu aktualisieren. Hat auch nicht geholfen.

Habe dann mein projekt geschlossen, neu geöffnet, hat auch nicht geholfen.

Das DataGridView ist mittels BindingSource an die Datenquelle gebunden.

Wie bekomme ich nun meine neue hinzugefügte Spalte in der Tabelle auch im DataGridView angezeigt?

Danke.
Gruß
Peter