Laden...

FindControll in Row beim laden des Grid

Erstellt von tom-cat vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.793 Views
T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren
FindControll in Row beim laden des Grid

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

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

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 😦

3.170 Beiträge seit 2006
vor 13 Jahren

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

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

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;

1.433 Beiträge seit 2006
vor 13 Jahren

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

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

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.

1.433 Beiträge seit 2006
vor 13 Jahren

Also mein vorgeschlagener Ansatz hat bis jetzt immer funktioniert 😉

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

T
tom-cat Themenstarter:in
77 Beiträge seit 2010
vor 13 Jahren

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.

1.433 Beiträge seit 2006
vor 13 Jahren

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

3.170 Beiträge seit 2006
vor 13 Jahren

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

1.433 Beiträge seit 2006
vor 13 Jahren

@MarsStein
Die kenne ich leider nicht X(

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt