Deprecated: Function set_magic_quotes_runtime() is deprecated in /var/www/web1643/html/phpBB3/common.php on line 106
[phpBB Debug] PHP Notice: in file /includes/session.php on line 916: Cannot modify header information - headers already sent by (output started at /common.php:106)
[phpBB Debug] PHP Notice: in file /includes/session.php on line 916: Cannot modify header information - headers already sent by (output started at /common.php:106)
[phpBB Debug] PHP Notice: in file /includes/session.php on line 916: Cannot modify header information - headers already sent by (output started at /common.php:106)

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 472

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/web1643/html/phpBB3/includes/bbcode.php on line 112
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 3526: Cannot modify header information - headers already sent by (output started at /common.php:106)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 3528: Cannot modify header information - headers already sent by (output started at /common.php:106)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 3529: Cannot modify header information - headers already sent by (output started at /common.php:106)
[phpBB Debug] PHP Notice: in file /includes/functions.php on line 3530: Cannot modify header information - headers already sent by (output started at /common.php:106)
ppsGrid.de • Thema anzeigen - problem mit einem user-control

problem mit einem user-control

Hier werden Fragen zur Programmierung des ppsGrids...

problem mit einem user-control

Beitragvon Lordas am 26.03.2008, 22:29

hallo torsten,

ich mal wieder :roll: :wink:

ACHTUNG vorweg - es ist ein richtig langes post von mir!!!

ich habe mir für eine anwendung, welche zugriff auf eine access-datenbank hat einen query-generator geschrieben, welcher über dein ppsGrid aufgebaut wird:

Bild

jetzt instanziiere ich zweimal mein eingabecontrol um es als display- und editcontrol zu nutzen - soweit noch richtig, oder?

die instanziierung inkl. der notwendigen parameter und hinzufügen zum querymanager sieht so aus:


Code: Alles auswählen
            List<Parameter> pList1 = new List<Parameter>();
            pList1.Add(new Parameter(new ComboBoxInputControl(mQueryGenerator, Common.Instanz.Anreden), "Anrede", "Anrede", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Firma", "Firma", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Name 1", "Name1", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Name 2", "Name2", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Name 3", "Name3", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Strasse", "Strasse", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "PLZ", "PLZ", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Ort", "Ort", mOperatorenText, new StringStatementbuilder()));
            pList1.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "PPLZ", "PPLZ", mOperatorenText, new StringStatementbuilder()));

            List<Parameter> pList2 = new List<Parameter>();
            pList2.Add(new Parameter(new ComboBoxInputControl(mQueryGenerator, Common.Instanz.Anreden), "Anrede", "Anrede", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Firma", "Firma", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Name 1", "Name1", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Name 2", "Name2", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Name 3", "Name3", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Strasse", "Strasse", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "PLZ", "PLZ", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "Ort", "Ort", mOperatorenText, new StringStatementbuilder()));
            pList2.Add(new Parameter(new TextBoxInputControl(mQueryGenerator), "PPLZ", "PPLZ", mOperatorenText, new StringStatementbuilder()));

            GridEingabeControl displayControl = new GridEingabeControl(pList1);
            GridEingabeControl editControl = new GridEingabeControl(pList2);
            mQueryGenerator.AddEingabeControl(new GridEingabeControl[] { displayControl,editControl});



es ist zwar jetzt ein wenig viel code - aber ich hoffe dadurch auf eine bessere hilfe von dir. in der methode mQueryGenerator.AddEingabeControl werden die zwei intanzen (display und edit) dann wiefolgt zugeordnet:

Code: Alles auswählen
                mEingabeControls = (GridEingabeControl[])eingabeControls;
                mGrid.Cols[1].Width = mEingabeControls[0].Width;
                mGrid.MaxColWidth = mEingabeControls[0].Width;
                mGrid.Rows[1].Height = mEingabeControls[0].Height + 3;
                mGrid.PreferredRowHeight = mEingabeControls[0].Height + 3;

                mGrid.Cols[1].ControlEditInfo.Control = mEingabeControls[0];
                mGrid.Cols[1].ControlEditInfo.PropertyName = "GridEingabeValues";
                //EndEditKey rausnehmen, da der ReturnDelegate durchgereicht werden muss und sonst nicht richtig reagiert,
                //da der KeyEditEnd = Return ist!
                mGrid.Cols[1].ControlEditInfo.KeyEditEnd = Keys.None;

                mGrid.Cols[1].ControlDisplayInfo.Control = mEingabeControls[1];
                mGrid.Cols[1].ControlDisplayInfo.PropertyName = "GridEingabeValues";

                mGrid[1, 1].Value = new GridEingabeControlValues(0, 0, string.Empty, string.Empty);



die zum schluss ersichtliche property-klasse (GridEingabeControlValues) sieht so aus:

Code: Alles auswählen
    public class GridEingabeControlValues
    {
        private int mComboBoxFieldSelectedIndex;
        private int mComboBoxConnectorSelectedIndex;
        private string mInputControlVonValue;
        private string mInputControlBisValue;

        public int ComboBoxFieldSelectedIndex
        {
            get
            {
                return mComboBoxFieldSelectedIndex;
            }
            set
            {
                mComboBoxFieldSelectedIndex = value;
            }
        }

        public int ComboBoxConnectorSelectedIndex
        {
            get
            {
                return mComboBoxConnectorSelectedIndex;
            }
            set
            {
                mComboBoxConnectorSelectedIndex = value;
            }
        }

        public string InputControlVonValue
        {
            get
            {
                return mInputControlVonValue;
            }
            set
            {
                mInputControlVonValue = value;
            }
        }

        public string InputControlBisValue
        {
            get
            {
                return mInputControlBisValue;
            }
            set
            {
                mInputControlBisValue = value;
            }
        }


        public GridEingabeControlValues(int selectedIndexField, int selectedIndexConnector, string von, string bis)
        {
            mComboBoxFieldSelectedIndex = selectedIndexField;
            mComboBoxConnectorSelectedIndex = selectedIndexConnector;
            mInputControlVonValue = von;
            mInputControlBisValue = bis;
        }
    }



eine zuordnung findet wie folgt im GridEingabeControl statt:

Code: Alles auswählen
        public GridEingabeControlValues GridEingabeValues
        {
            get
            {
                return new GridEingabeControlValues(mComboBoxField.SelectedIndex, mComboBoxConnector.SelectedIndex, mInputControl.VonValue, mInputControl.BisValue);
            }
            set
            {
                mComboBoxField.SelectedIndex = value.ComboBoxFieldSelectedIndex;
                mComboBoxConnector.SelectedIndex = value.ComboBoxConnectorSelectedIndex;
                mInputControl.VonValue = value.InputControlVonValue;
                mInputControl.BisValue = value.InputControlBisValue;
            }
        }



sobald ich dann ein oben ersichtliches suchfeld (also Name1, Name2, Ort, PLZ, ...) ändere passiert folgendes:

Code: Alles auswählen
         mParameter = (Parameter)mComboBoxField.SelectedItem;

            //altes InputControl entfernen
            mPanelInputControlHolder.Controls.Remove(mInputControl);
            //neues festhalten
            mInputControl = mParameter.InputControl;
            //Daten aus altem InputControl löschen, falls vorhanden
            mInputControl.ResetInput();

            //ConnectorBox neu aufbauen
            mComboBoxConnector.Items.Clear();
            //VorzeichenCombobox füllen
            for (int i = 0; i < mParameter.Operatoren.Length; i++)
            {
                mComboBoxConnector.Items.Add(Operator.Instanz[mParameter.Operatoren[i]]);
            }

            mComboBoxConnector.SelectedIndex = 0;

            //InputControl neu aufbauen
            mInputControl.Dock = DockStyle.Fill;
            mPanelInputControlHolder.Controls.Add(mInputControl);
            mInputControl.BringToFront();
            mInputControl.Focus();




das funktioniert auch alles ganz gut soweit - ich habe nur folgende probleme:

1) ich kann alle eingabecontrols löschen, bis auf den rootknoten (1. zeile). dies passiert über folgenden code:

Code: Alles auswählen
            //es muss immer mind. die Rootzeile + Spaltenheader existieren
            if (mGrid.Selection.Rows.Count > 0 && mGrid.Rows.Count > 2)
            {
                //Rootzeile darf nicht gelöscht werden
                if (!mGrid.Selection.Rows[0].Equals(mGrid.Rows[1]))
                {
                    //es kann nur eine Row selektiert sein
                    mGrid.Rows.Remove(mGrid.Selection.Rows[0]);
                }
            }


wenn ich jetzt wieder eine zeile über nachfolgenden code hinzufügen möchte:

Code: Alles auswählen
            GridRow row = mGrid.Selection.Rows[0];
            int r = row.Outline.AddChilds(1);
            row.Outline.OpenChild();

            mGrid[1,r].Value = new GridEingabeControlValues(0, 0, string.Empty, string.Empty);


zeigt es mir im outline bild nur noch ein plus an, das ich aber weder aufklappen kann bzw. sonst irgendwas damit anstellen kann.

2) ein anderes problem habe ich, wenn ich z.b. zwei eingabecontrols habe und beide auf den gleichen selektionswert eingestellt habe, dann suche --> funktioniert noch problemlos. jetzt lösche ich eine zeile und versuche in die zweite noch verbliebene nochmal was einzugeben, dann kommt folgende fehlermeldung:



Informationen über das Aufrufen von JIT-Debuggen
anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

************** Ausnahmetext **************
System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei ppsGrid.GridCell.get__ControlEditInfo()
bei ppsGrid.GridCell.ctrl_KeyDown(Object sender, KeyEventArgs e)
bei System.Windows.Forms.KeyEventHandler.Invoke(Object sender, KeyEventArgs e)
bei System.Windows.Forms.Control.OnKeyDown(KeyEventArgs e)
bei System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
bei System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
bei System.Windows.Forms.Control.WmKeyChar(Message& m)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.TextBoxBase.WndProc(Message& m)
bei System.Windows.Forms.TextBox.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)



kann es sein, dass ich mir da irgendwie meine parameter zerschiesse und jetzt kein editcontrol mehr für dieses auswahlkriterium vorhanden ist?

3) ist mir aufgefallen, dass das grid nicht mehr richtig nachgezeichnet wird, wenn ich eine elternzeile lösche. d.h. es bleibt die kindzeile weiterhinstehen und passt natürlich nicht mehr richtig zusammen

Bild

oder ist da der programmierer selbst in der verantwortung, dass er dann alle kinder mit entfernt?


ich weiß ich mute dir ganz schön viel zu - aber ich bin an einem punkt angekommen, der es mir wirklich sehr schwer machen würde den abfragegenerator wieder über den haufen zu werfen...

vielleicht hast du ja hinweise, vorschläge o.ä. für mich.
ich würde mich sehr über deine hilfe freuen.

vielen dank schon mal

gruß
david
Lordas
 
Beiträge: 16
Registriert: 21.02.2008, 16:57

Beitragvon torsten am 28.03.2008, 10:28

Hallo Lordas

ACHTUNG vorweg - es ist ein richtig langes post von mir!!!
Ich seh' schon... wollen mal durchackern... :-)


jetzt instanziiere ich zweimal mein eingabecontrol um es als display- und editcontrol zu nutzen - soweit noch richtig, oder?
Wenn ich die Abbildung richtet deute, würde ich mehr als zwei Controls benutzen. Die linken Controls zeigen die Feldnamen an, die mittleren den 'Vergleichstyp' und die rechten den 'Parameter'. Frage: Warum alles in ein Control? Erzeuge doch drei spezifische Controls (gridFieldControl, gridAssignControl und gridParamControl). Die drei könnten dann jeweils die Ein- als auch die Ausgabe im Grid übernehemen. Ist aber wie immer: Drei Programmierer haben vier Lösungen :-)


Code: Alles auswählen
  mQueryGenerator.AddEingabeControl(new GridEingabeControl[] { displayControl,editControl});
Übergabe von zwei Controls als Array...


[viel Code...]
Sieht mir alles etwas unübersichtlich aus. Du setzt hier die Controls nur für Spalte eins, richtig ?


Code: Alles auswählen
mGrid.Cols[1].ControlEditInfo.Control = mEingabeControls[0];
mGrid.Cols[1].ControlEditInfo.PropertyName = "GridEingabeValues";
...
mGrid.Cols[1].ControlDisplayInfo.Control = mEingabeControls[1];
mGrid.Cols[1].ControlDisplayInfo.PropertyName = "GridEingabeValues";
dann


die zum schluss ersichtliche property-klasse (GridEingabeControlValues) sieht so aus:
sieht eigentlich alles ok aus. Zumindest kann ich so keine offensichtlichen Fehler sehen.


eine zuordnung findet wie folgt im GridEingabeControl statt:
Auch gut. Die Zellen-Values können per get/set-Property gelesen bzw. geschrieben werden. Sollte so funktionieren.


sobald ich dann ein oben ersichtliches suchfeld (also Name1, Name2, Ort, PLZ, ...) ändere passiert folgendes:
Wo passiert das ???


mParameter = (Parameter)mComboBoxField.SelectedItem;

//altes InputControl entfernen
mPanelInputControlHolder.Controls.Remove(mInputControl);
....
Damit kann ich nicht vel anfangen (was ist mPanelInputControlHolder? Was ist mParameter.InputControl? Was ist mComboBoxConnector? (usw. usw.)


das funktioniert auch alles ganz gut soweit
Puuuh, Glück gehabt :-).


...ich habe nur folgende probleme
Zu früh gefreut...


//es kann nur eine Row selektiert sein
mGrid.Rows.Remove(mGrid.Selection.Rows[0]);
VORSICHT: Du entfernst die Zeile, und nicht die Markierung !!! Entferne die Markierung einer Zeile einfach durch
Code: Alles auswählen
row.Selected=false

Wenn immer nur eine Zeile markiert sein darf, kannst du mit
Code: Alles auswählen
grid.SelectionMode = eSelectionMode.One
grid.SelectionType = eSelectionType.Row
das entspr. einstellen.


Dann
Code: Alles auswählen
            GridRow row = mGrid.Selection.Rows[0];
            int r = row.Outline.AddChilds(1);
            row.Outline.OpenChild();

            mGrid[1,r].Value = new GridEingabeControlValues(0, 0, string.Empty, string.Empty);
Sieht gut aus...


zeigt es mir im outline bild nur noch ein plus an, das ich aber weder aufklappen kann bzw. sonst irgendwas damit anstellen kann.
Wahrscheinlich, weil du die Zeile gelöscht statt deselektiert hast, siehe oben...


jetzt lösche ich eine zeile und versuche in die zweite noch verbliebene nochmal was einzugeben, dann kommt folgende fehlermeldung:
Mhhh. Du sprichst von zwei Controls. Es ist aber nur ein Control auf zwei Zeilen, richtig?


3) ist mir aufgefallen, dass das grid nicht mehr richtig nachgezeichnet wird, wenn ich eine elternzeile lösche. d.h. es bleibt die kindzeile weiterhinstehen und passt natürlich nicht mehr richtig zusammen.....oder ist da der programmierer selbst in der verantwortung, dass er dann alle kinder mit entfernt?
Ja, das stimmt. Das Grid löscht selbständig kein Zeilen oder Spalten...

So aus dem Kopf...
Code: Alles auswählen
while(row.Outline.HasChild)
  Rows.Remove(row.Outline.FirstChild);



Ist schon schwer ohne wirklichen Quelltext. Punkt eins liegt wohl am löschen statt deselektieren, Punkt zwei ist ohne Quelltext schwierig (ich könnte an der Stelle 'ppsGrid.GridCell.get__ControlEditInfo()' zusätzliche Sicherheitsabfragen ins ppsGrid einbauen). Punkt drei ist wohl geklärt...

Gruß Torsten
torsten
Site Admin
 
Beiträge: 92
Registriert: 02.05.2006, 09:04
Wohnort: Bremen

Beitragvon Lordas am 28.03.2008, 19:40

Administrator hat geschrieben:Wenn ich die Abbildung richtet deute, würde ich mehr als zwei Controls benutzen. Die linken Controls zeigen die Feldnamen an, die mittleren den 'Vergleichstyp' und die rechten den 'Parameter'. Frage: Warum alles in ein Control? Erzeuge doch drei spezifische Controls (gridFieldControl, gridAssignControl und gridParamControl). Die drei könnten dann jeweils die Ein- als auch die Ausgabe im Grid übernehemen. Ist aber wie immer: Drei Programmierer haben vier Lösungen :-)


ja das ist richtig - man kann es so oder so machen. es ist letztendlich ein control, da die abhängigkeit untereinander desöfteren gegeben ist, z.b. vergleichstyp abhängig von gewähltem feldnamen usw. daher sind die einzelnen controls einfach auf ein usercontrol geworfen worden bzw. kann das parametercontrol (also dort wo die eigentliche eingabe getätigt wird) ausgetauscht werden, d.h. wird erst zur laufzeit gesetzt - je nachdem welcher feldname dafür notwendig ist (z.b. textbox bei normal-text, datetimepicker für datumsabfragen, checkboxen bei ja nein usw.). die setzung der controls siehst du in der parameterdefinition:

Code: Alles auswählen
new Parameter(new ComboBoxInputControl(mQueryGenerator, Common.Instanz.Anreden), "Anrede", "Anrede", mOperatorenText, new StringStatementbuilder())



Code: Alles auswählen
  mQueryGenerator.AddEingabeControl(new GridEingabeControl[] { displayControl,editControl});
Übergabe von zwei Controls als Array...


richtig

Sieht mir alles etwas unübersichtlich aus. Du setzt hier die Controls nur für Spalte eins, richtig ?


ja klar, ich setze die controls in spalte 1 bzw. 2 (da ja nullindex-basierend). in der ersten spalte ist nur eine combobox hinterlegt, welche dir die connectorenauswahl bietet (UND, ODER, NICHT UND, NICHT ODER)


Code: Alles auswählen
mGrid.Cols[1].ControlEditInfo.Control = mEingabeControls[0];
mGrid.Cols[1].ControlEditInfo.PropertyName = "GridEingabeValues";
...
mGrid.Cols[1].ControlDisplayInfo.Control = mEingabeControls[1];
mGrid.Cols[1].ControlDisplayInfo.PropertyName = "GridEingabeValues";
dann


genau hier wird das array wieder aufgeteilt und an das editcontrol und das displaycontrol übergeben. das es als array übergeben wird ist historisch bedingt, da es noch ein weiteres weniger flexibles querycontrol entgegennehmen kann.

sobald ich dann ein oben ersichtliches suchfeld (also Name1, Name2, Ort, PLZ, ...) ändere passiert folgendes:
Wo passiert das ???


der teil des codes wird durch das selectedindexchange event der feldauswahl-combobox ausgelöst.


mParameter = (Parameter)mComboBoxField.SelectedItem;

//altes InputControl entfernen
mPanelInputControlHolder.Controls.Remove(mInputControl);
....
Damit kann ich nicht vel anfangen (was ist mPanelInputControlHolder? Was ist mParameter.InputControl? Was ist mComboBoxConnector? (usw. usw.)


ok: also hinter der feldauswahlcombobox ist das parameter-objekt hinterlegt. d.h. sobald das o.g. event ausgelöst wird, ziehe ich mir das aktuelle parameter-objekt aus der combobox raus. dann entferne ich das eigentliche eingabecontrol = mParameter.InputControl (du hast es oben parametercontrol genannt) - also die textbox, den datetimepicker usw. - aus dem großen eingabecontrol (aus dem panel, welches mPanelInputControlHolder heißt). die ComboBoxConnector enthält die vergleichstypen. da die vergleichstypen abhängig vom gewählten feld sind werden sie ebenfalls durch das o.g. event neu gefüllt (sind ebenfalls im parameter-objekt hinterlegt).

das funktioniert auch alles ganz gut soweit
Puuuh, Glück gehabt :-).


ja aber es scheint ja nur die halbe miete zu sein :-)

//es kann nur eine Row selektiert sein
mGrid.Rows.Remove(mGrid.Selection.Rows[0]);
VORSICHT: Du entfernst die Zeile, und nicht die Markierung !!! Entferne die Markierung einer Zeile einfach durch
Code: Alles auswählen
row.Selected=false

Wenn immer nur eine Zeile markiert sein darf, kannst du mit
Code: Alles auswählen
grid.SelectionMode = eSelectionMode.One
grid.SelectionType = eSelectionType.Row
das entspr. einstellen.


ist auch so gewollt. die einstellung ist so gesetzt, dass auch nur eine zeile selektiert werden kann. diese selektierte zeile soll dann entfernt werde (klick auf den roten minus-button im toolstrip). es können alle kinder entfernt werden, bis auf die rootzeile (d.h. die zeile nummer 1 hinter der header-zeile).


Dann
Code: Alles auswählen
            GridRow row = mGrid.Selection.Rows[0];
            int r = row.Outline.AddChilds(1);
            row.Outline.OpenChild();

            mGrid[1,r].Value = new GridEingabeControlValues(0, 0, string.Empty, string.Empty);
Sieht gut aus...


genau das funktioniert aber nicht mehr, wenn ich alle kinder (bis auf root) aus dem grid gelöscht habe. d.h. sobald ich dann wieder über diesen code eine zeile hinzufüge erscheint nur noch ein plus, welches ich nicht mehr aufklappen kann. allgemein scheint das control so nicht mehr richtig zu reagieren.

zeigt es mir im outline bild nur noch ein plus an, das ich aber weder aufklappen kann bzw. sonst irgendwas damit anstellen kann.
Wahrscheinlich, weil du die Zeile gelöscht statt deselektiert hast, siehe oben...


siehe oben. das plus erscheint in der ersten zeile, welche nicht gelöscht werden kann (ist auch so im quellcode abgefangen).


jetzt lösche ich eine zeile und versuche in die zweite noch verbliebene nochmal was einzugeben, dann kommt folgende fehlermeldung:
Mhhh. Du sprichst von zwei Controls. Es ist aber nur ein Control auf zwei Zeilen, richtig?


ja, ich habe das editcontrol und das displaycontrol einer spalte zugeordnet. dadurch habe ich ja automatisch nur das eine control auf allen untergeordneten zeilen (bzw. sind es ja zwei controls - eines zum einsatz für das editieren und eine zweite instanz für die anzeige).

3) ist mir aufgefallen, dass das grid nicht mehr richtig nachgezeichnet wird, wenn ich eine elternzeile lösche. d.h. es bleibt die kindzeile weiterhinstehen und passt natürlich nicht mehr richtig zusammen.....oder ist da der programmierer selbst in der verantwortung, dass er dann alle kinder mit entfernt?
Ja, das stimmt. Das Grid löscht selbständig kein Zeilen oder Spalten...

So aus dem Kopf...
Code: Alles auswählen
while(row.Outline.HasChild)
  Rows.Remove(row.Outline.FirstChild);



ok, das wäre geklärt!


Ist schon schwer ohne wirklichen Quelltext. Punkt eins liegt wohl am löschen statt deselektieren, Punkt zwei ist ohne Quelltext schwierig (ich könnte an der Stelle 'ppsGrid.GridCell.get__ControlEditInfo()' zusätzliche Sicherheitsabfragen ins ppsGrid einbauen). Punkt drei ist wohl geklärt...

Gruß Torsten


ja ich weiß. wenn du möchtest kann ich dir gerne ein kleines projekt zusammenstellen... so kannst du das mit einer kleinen anleitung selbst nachstellen und auch durchspielen.

wäre wirklich super.

vielen dank auch jetzt schon mal für deine antwort.

gruß
david
Lordas
 
Beiträge: 16
Registriert: 21.02.2008, 16:57

Beitragvon torsten am 29.03.2008, 13:03

Hallo Lordas

ja ich weiß. wenn du möchtest kann ich dir gerne ein kleines projekt zusammenstellen... so kannst du das mit einer kleinen anleitung selbst nachstellen und auch durchspielen.
Ich denke, dass das nötig sein wird. Auf jeden Fall nur die Dinge, die nötig sind, um die Fehler zu finden (weniger ist mehr :-))
Gruß Torsten
torsten
Site Admin
 
Beiträge: 92
Registriert: 02.05.2006, 09:04
Wohnort: Bremen

Beitragvon Lordas am 29.03.2008, 19:30

hab dir eine mail auf die info@ppsgrid... geschrieben.

danke dir!
Lordas
 
Beiträge: 16
Registriert: 21.02.2008, 16:57

Beitragvon torsten am 30.03.2008, 19:46

Hallo Lordas

hab dir eine mail auf die info@ppsgrid... geschrieben.
...und erhalten

Punkt 1 ist erledigt: Als Behelf kannst du folgenden "Workaround" nutzen:
Code: Alles auswählen
            GridRow row = mGrid.Selection.Rows[0];
            int r = row.Outline.AddChilds(1);
            row.Outline.OpenChild();

Und dann folgendes
Code: Alles auswählen
            row.Outline.FirstChild.Visible=true;

Der Fehler kommt dann zustande, wenn das letzte Child gelöscht wird (Es wird dann ein interner "OpenCounter" nicht richtig zurückgesetzt).


Fehler Nr. 2 scheint weitaus komplexer. Den werde ich mir im Laufe der Woche vornehemen...
Ich meld' mich auf jeden Fall.
Gruß Torsten
torsten
Site Admin
 
Beiträge: 92
Registriert: 02.05.2006, 09:04
Wohnort: Bremen

Beitragvon Lordas am 30.03.2008, 21:06

hey super,

d.h. es sind bugs im ppsGrid, oder? dachte schon hier haben meine programmierkünste mal wieder zugeschlagen.

punkt 1 funktioniert mit dem workaround. wenn ich es richtig verstanden habe wirst du den fehler aber in einer neuen version bereinigt haben...

bin schon auf den 2. fehler gespannt...
Lordas
 
Beiträge: 16
Registriert: 21.02.2008, 16:57

Beitragvon torsten am 02.04.2008, 09:57

Hallo David
Hab' dir eine "fehlerbereinigte" Version zugeschickt...
(Bitte schaue in deine Spam-Ordner... :-))
Gruß Torsten
torsten
Site Admin
 
Beiträge: 92
Registriert: 02.05.2006, 09:04
Wohnort: Bremen

Beitragvon Lordas am 02.04.2008, 21:43

hi torsten,

danke für die neue version.
ich werde sie die nächsten tage genauer testen. aktuell sieht es ganz gut aus.

das einzige was ich mir vorstellen könnte sind folgende codezeilen:

mParameter = (Parameter)mComboBoxField.SelectedItem;
...
mInputControl = mParameter.InputControl;

d.h. ich ziehe mir aus meinem usercontrol (aus der feldauswahl) mein parameter-objekt, dass die informationen zum verwendeten eingabecontrol und auch zu den vergleichsoperatoren usw. enthält. danach halte ich daraus auch noch das aktuelle eingabecontrol fest. wenn ich jetzt natürlich zwei teilen mit dem gleichen parameter gewählt habe und einen davon lösche könnte ich mir vorstellen, dass irgendwo noch ein verweis festhängt.

hilft dir das vielleicht weiter? sonst wüsste ich nicht wo ich verweise hätte. direkte verweise auf zeilen habe ich definitiv nicht.

gruß
david

p.s.: habe meine mailadresse geändert, da sollten deine mails zukünftig auch durchkommen ;-)
Lordas
 
Beiträge: 16
Registriert: 21.02.2008, 16:57

Beitragvon Lordas am 11.04.2008, 20:54

hallo torsten,

sorry für die späte antwort.
also bislang konnte ich keinen fehler mehr feststellen.

was denkst du bzgl. angesprochenen verweise?

gruß
david
Lordas
 
Beiträge: 16
Registriert: 21.02.2008, 16:57

Beitragvon torsten am 14.04.2008, 12:17

Hallo David

was denkst du bzgl. angesprochenen verweise?
So oder so: Ich sollte das Grid dahingehend erweitern, dass ich mir merke, ob das Grid oder Teile davon (zum Beispiel Zeilen oder Spalten) freigegeben (Dispose...) wurden. Wenn ich (bzw. der Programmierer) nach der Freigabe noch auf die Objekte zugreifen kann, bestehen noch Verweise auf diese Objekte. Dann sind solche internen (IsDisposed-) Merker prima.

Das nächste Wocheende kommt bestimmt :-)
Gruß Torsten
torsten
Site Admin
 
Beiträge: 92
Registriert: 02.05.2006, 09:04
Wohnort: Bremen


Zurück zu Fragen zur Programmierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron