Announcement

Collapse
No announcement yet.

GridView.FooterRow selbst erstellen: HyperLink.NavigateUrl wird falsch übernommen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • GridView.FooterRow selbst erstellen: HyperLink.NavigateUrl wird falsch übernommen

    Hallo,

    in einer selbst erstellten GridView-Klasse sollen Header und Footer auch bei leerer Ergebnismenge angezeigt werden, da über die FooterRow ein neuer Eintrag hinzugefügt werden kann.
    In der GridView (aspx) wird u.a. ein HyperLink verwendet, dessen NavigateUrl-Feld einen JavaScript-Aufruf mit dynamisch per Eval() erstellten Parametern enthält.

    Nun das Problem:
    Die Url wird in der Fußzeile völlig korrekt erstellt, wenn in der GridView Datensätze angezeigt werden, d.h. wenn nicht auf die überschriebene CreateChildControls(...) Methode in meiner GridView-Klasse zurückgegriffen wird.
    Wird diese jedoch benutzt und erstellt dazu selbst eine Fußzeile, ist das Feld NavigateUrl leer bzw. wird im generierten HTML-Code erst gar kein Link erstellt.
    Ich habe dies inzwischen soweit eingrenzen können, dass ich sagen kann, dass dieser Fehler offenbar mit der Verwendung von Eval() zusammenhängen muss: ersetze ich den NavigateUrl-Inhalt nämlich durch einen festen String ohne Dynamik (z.B. NavigateUrl="http://www.gmx.de"), wird dies auch korrekt übernommen.

    Hier mal der Code:

    abgeleitete GridViewKlasse:
    Code:
    public class EmptyGridView : GridView
      {
        protected GridViewRow footerRowEmpty;
    
        protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
        {
          int numRows = base.CreateChildControls(dataSource, dataBinding);
    
          //no data rows created, create empty table if enabled
          if (numRows == 0)
          {
            Table table = new Table();
            table.ID = this.ID;
    
            // convert the exisiting columns into an array and initialize
            DataControlField[] fields = new DataControlField[this.Columns.Count];
            this.Columns.CopyTo(fields, 0);
    
            // create a new header row
            GridViewRow headerRow = base.CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
            this.InitializeRow(headerRow, fields);
            table.Rows.Add(headerRow);
    
            // create the empty row
            GridViewRow emptyRow = new GridViewRow(-1, -1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
            TableCell cell = new TableCell();
            cell.ColumnSpan = this.Columns.Count;
            cell.Width = Unit.Percentage(100);
            //cell.Controls.Add(new LiteralControl(EmptyTableRowText));
            emptyRow.Cells.Add(cell);
            table.Rows.Add(emptyRow);
    
            // create the footer row
            footerRowEmpty = base.CreateRow(-1, -1, DataControlRowType.Footer, DataControlRowState.Normal);
            this.InitializeRow(footerRowEmpty, fields);
            table.Rows.Add(footerRowEmpty);
    
            this.Controls.Add(table);
          }
          return numRows;
        }
    
        public override GridViewRow FooterRow
        {
          get
          {
            GridViewRow foot = base.FooterRow;
            if (foot != null)
            {
              return foot;
            }
            else
            {
              return footerRowEmpty;
            }
          }
        }
      }
    overview.aspx (sinnerhaltend verkürzt auf das Wesentliche).
    Die hier nicht aufgeführte JavaScript-Funktion datePicker benötigt als Parameter die IDs der beiden Felder, in die das vom User gewählte Datum zurückgeschrieben wird.
    Code:
            <hlp:EmptyGridView ID="gvDetails" runat="server" AutoGenerateColumns="False" DataSourceID="odsDetails" 
                AllowSorting="True" DataKeyNames="FolderId, UserName" ShowFooter="true" OnRowCommand="details_RowCommand">
              <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox ID="tbExpiryDate" runat="server" Text='<%# Bind("ExpiryDate") %>' CssClass="invisible" />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Expiration date" SortExpression="ExpiryDate">
                    <ItemTemplate>
                        <asp:Label ID="lblExpiryDate" runat="server" Text='<%# Eval("ExpiryDate") %>' ToolTip="The date at which the access will expire" />
                    </ItemTemplate>
                    <FooterTemplate>
                        <asp:TextBox ID="tbExpiryDate_ftr" runat="server" Text='' CssClass="invisible" />
                        <asp:Label ID="lblExpiryDate_ftr" runat="server" Text='' ToolTip="The date at which the access will expire" />
                    </FooterTemplate>
                </asp:TemplateField>
              
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:HyperLink id="imgDatePicker" runat="server" ImageUrl="~/Images/calendar.jpg"
                         NavigateUrl='<%# "javascript:datePicker(\"" + ((GridViewRow)Container).FindControl("tbExpiryDate").ClientID + 
                            "\", \"" +((GridViewRow)Container).FindControl("lblExpiryDate").ClientID + "\");" %>' ToolTip="Open a date picker window" />
                    </ItemTemplate>
                    <FooterTemplate>
                        <asp:HyperLink id="imgDatePicker_ftr" runat="server" ImageUrl="~/Images/calendar.jpg"
                         NavigateUrl='<%# "javascript:datePicker(\"" + ((GridViewRow)Container).FindControl("tbExpiryDate_ftr").ClientID + 
                            "\", \"" +((GridViewRow)Container).FindControl("lblExpiryDate_ftr").ClientID + "\");" %>' ToolTip="Open a date picker window" />
                    </FooterTemplate>
                </asp:TemplateField>
              
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Button ID="btnUpdate" runat="server" Text="Save" CommandName="Update" ToolTip="Save changes made to this user" />
                    </ItemTemplate>
                    <FooterTemplate>
                        <asp:Button ID="btnInsert" runat="server" Text="Add new user" CommandName="Insert" ToolTip="Add a new user" />
                    </FooterTemplate>
                </asp:TemplateField>
              </Columns>
            </hlp:EmptyGridView>
        
        <asp:ObjectDataSource ID="odsDetails" runat="server" SelectMethod="GetListOfUserRights" SortParameterName="sort"
            TypeName="RightsFolder" UpdateMethod="UpdateRow" DeleteMethod="DeleteUser" InsertMethod="AddUser" >
        </asp:ObjectDataSource>
    Die Code-behind Datei interessiert hier imho nicht, es geht mir allein um die Erstellung der eigenen Fußzeile.
    Alles Googeln bringt mir keine andere Erkenntnis, als dass man die Fußzeile nur genauso wie oben verwendet erstellen könnte. Ich befürchte, dass das Problem innerhalb von this.InitializeRow(footerRowEmpty, fields); steckt, aber ich weiß nicht, wie ich es anders machen könnte.

    Ich hoffe Ihr könnt mir weiterhelfen, meine Kollegen können es nicht

    Danke schon jetzt,
    Rob

    P.S.: Ich verwende übrigens .Net 3.5

    P.P.S.: Anscheinend beschränkt sich das Problem nicht auf das HyperLink-Tag. Wenn ich einen ähnlichen JavaScript-Aufruf in das OnClientClick-Tag schreibe, erscheint es ebenfalls nicht in der HTML-Ausgabe.
    Vermutlich gilt das für jedes Tag, welches einen zusammengesetzten (bzw. mit <%# %> serverseitig zu erstellenden) URL-String enthält.
    Zuletzt editiert von RobOtter; 24.06.2010, 14:59.
Working...
X