Moin zusammen,
ich hab da mal ne kleine Frage.
Ich habe ein GridView, welches in den DataItemTemplates eine DropDownBox hat und in dieser wiederrum einen TreeView.
Um nun im CodeBehind dran zu kommen, muss ich mir ja das TreeView suchen und dann befüllen etc.pp.
Hier habe ich mal mit anfangen:
protected void ASPxGridView1_RowCreated(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewTableRowEventArgs e)
{
ASPxTreeView tv = this.ASPxGridView2.FindRowTemplateControl(e.VisibleIndex,"ASPxTreeView1") as ASPxTreeView;
tv.VirtualModeCreateChildren += new TreeViewVirtualModeCreateChildrenEventHandler(treeView_VirtualModeCreateChildren);
}
Das ist beim Grid angegeben wenn es sich läd bez. im "OnHtmlRowCreated="ASPxGridView1_RowCreated"".
Dabei bekomme ich jedoch schon einen Fehler das er das TreeView nicht finden kann und knallt mir eine NULL Exeption raus.
Teste ich das ganze ohne Gridview nur mit einer Combobox und TreeView klappt das super.
Hier der Fehler:
Zeile 63: {
[B]Zeile 64: ASPxTreeView tv = this.ASPxGridView2.FindRowTemplateControl(e.VisibleIndex,"ASPxDropDownEdit1") as ASPxTreeView;[/B] <=== NULL EXEPITON
Zeile 65: tv.VirtualModeCreateChildren += new TreeViewVirtualModeCreateChildrenEventHandler(treeView_VirtualModeCreateChildren);
Zeile 66:
Zeile 67: }
Hat jemand ne Idee ?
Besten Dank schon mal !
Tom
Ich habe mir auch schon die Funktion von Peter angeschaut wo ich Rekursiv danach suchen kann, jedoch findet er auch mit dieser Methode das TreeView nicht.
Hier mal ein ausschnitt des ASPX Codes auch noch:
<dx:GridViewDataDropDownEditColumn Caption="Test2" VisibleIndex="2">
<DataItemTemplate>
<dx:ASPxDropDownEdit ID="ASPxDropDownEdit1" runat="server" OnClientDropDownOpened="OnClientDropDownOpenedHandler" ClientIDMode="AutoID">
<DropDownWindowTemplate>
<dx:ASPxTreeView ID="ASPxTreeView1" runat="server" >
</dx:ASPxTreeView>
</DropDownWindowTemplate>
</dx:ASPxDropDownEdit>
</DataItemTemplate>
</dx:GridViewDataDropDownEditColumn>
Es ist ja im Prinzip egal ob ich nun die Components von DevExpress nutze oder ein normales Grid, dabei funktioniert es leider auch nicht 😦
Hallo,
vermutlich sucht FindRowTemplateControl
nur flach auf der ersten Ebene des Templates. Wenn dem so ist, musst Du zuerst das ASPxDropDownEdit1
-Control suchen, und in diesem dann weitersuchen nach dem TreeView.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Ja das habe ich auch schon gemacht, weil mir der Gedanke auch gekommen ist, jedoch findet FindRowTemplateControl oder andere Find Methoden noch nicht mal die "1. Ebene" sprich das DropDownEdit1.
Wenn ich das ganze ohne ein Grid mache kann ich ohne Probleme in das Treeview welches im Template der Dropdownbox liegt zugreifen ?! 😦
Edit:
Ich habe es so versucht:
ASPxTreeView tv = ASPxGridView2.FindRowTemplateControl(e.VisibleIndex,"ASPxTreeView1") as ASPxTreeView;
// Oder hier über beide Ebenen
ASPxDropDownEdit dde = ASPxGridView2.FindRowTemplateControl(e.VisibleIndex,"ASPxDropDownEdit1") as ASPxDropDownEdit;
ASPxTreeView tv = dde.FindControl("ASPxTreeView1") as ASPxTreeView;
Wenn ich ein Control suchen will, dass in einem Template vorhanden ist, dann mache ich dass im OnRowDataBound. Dort kannst Du mit
foreach(var cell in e.row.cells){
Control myControl = (Control)cell.FindControl("MyControl");
}
Danach suchen.
Wichtig ist, dass Du am Anfang überprüfst ob die Row eine Header oder eine DataRow ist. Wenn das Control in keiner Header-Row vorhanden ist, dann hast Du die NULL-Reference Exception darum prüfe ich immer so:
if (e.Row.RowType == DataControlRowType.DataRow){
foreach (DataControlFieldCell cell in e.Row.Cells.OfType<DataControlFieldCell>().ToList())
{
if (cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>() != null && cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>().ID.Contains("SmartCardExpress"))
{
smartcardexpress = cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>();
}
if (cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>() != null && cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>().ID.Contains("PermanentService"))
{
permanentservice = cell.Controls.OfType<CheckBox>().FirstOrDefault<CheckBox>();
}
}
}
So funktionierts bei mir eigentlich immer. Und wenn Du die DropDownListBox gefunden hast, kannst Du dort wiederum
MyDropDonwListBox.Controls.OfType<TreeView>()
zum suchen verwenden.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
Danke euch.
Ich habe jetzt diesen Ansatz gewählt:
ASPxDropDownEdit dd =
(ASPxDropDownEdit)ASPxGridView2.FindRowCellTemplateControl(e.VisibleIndex, (GridViewDataColumn)ASPxGridView2.Columns["Test2"], "ASPxDropDownEdit1");
Damit komme ich zumindest auf die DropDownEdit Box.
Dennoch wenn ich jetzt hier weiter will, geht auch das irgendwie nicht:
ASPxTreeView tv2 =
(ASPxTreeView)dd.FindControl("ASPxTreeView");
tv2.VirtualModeCreateChildren += new TreeViewVirtualModeCreateChildrenEventHandler(treeView_VirtualModeCreateChildren);
Das ganze habe ich im RowPrepared Event gelöst.
Also mein vorgeschlagener Ansatz hat bis jetzt immer funktioniert 😉
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
Hi Schaedld
bei deinem Ansatz komme ich nicht weiter bei :
foreach(var cell in e.row.cells){
Control myControl = (Control)cell.FindControl("MyControl");
}
beim cell habe ich kein FindControl zur auswahl.
Ich gehe auf die ASPxGridViewTableRowEventArgs und bekomme dort dowas nicht angeboten.
TableRowEventArgs dieses Event ist gemäss Suche auf Google nur im Infragistics Grid vorhanden. Ich beziehe mich auf das Standard GridView von .NET.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
Hallo,
@schaedld
ich vermute es handlet sich bei den benutzten Controls um Komponenten von DevExpress.
@tom-cat
deshalb fällt es von hier an schwer, weiterzuhelfen, da es sich nicht um Standardkomponenten handelt und sich Deine Controls von Aufbau und Benutzung her offenbar etwas vom Standard abheben.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
@MarsStein
Die kenne ich leider nicht X(
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt