ich mal wieder
![Rolling Eyes :roll:](./images/smilies/icon_rolleyes.gif)
![Wink :wink:](./images/smilies/icon_wink.gif)
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:
![Image](http://home.arcor.de/intelligence-it/Bilder/queryGenerator.jpg)
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: Select all
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: Select all
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: Select all
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: Select all
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: Select all
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: Select all
//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]);
}
}
Code: Select all
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);
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
![Image](http://home.arcor.de/intelligence-it/Bilder/queryGenerator_fehler.jpg)
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