Laden...

GridView - ItemTemplate

Erstellt von Cr95is vor 11 Jahren Letzter Beitrag vor 11 Jahren 890 Views
C
Cr95is Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren
GridView - ItemTemplate

Hallo liebe Comm,

mein Problem liegt beim Ändern der Daten eines ItemTemplates von einem GridView über das Code-behind file.

Hier der Code für mein GridView:


<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataSourceID="ObjectDataSource1">
        <Columns>
            <asp:TemplateField HeaderText="" SortExpression="p_id">
                <ItemTemplate>
                <table width="800" border="2" >
                    <tr bgcolor="#999999"> 
                        <td colspan="2"><asp:Label Font-Bold="true" ID="Label2" runat="server" Text='<%# Eval("p_title") %>'></asp:Label></td>
                    </tr>
                    <tr align="center" >
                        <td>
                            <asp:Image ID="imgUser" ImageUrl="../Pic/Default.png" Width="100px" Height="100px" runat="server" /> <% insertPic(); %>
                            <br /><asp:Label Width="100" ID="labelUser" runat="server" Text='<%# Eval("p_u_username") %>'></asp:Label>
                            <asp:Label ID="Labelp_id" runat="server" Text='<%# Eval("p_id") %>' Visible="false"></asp:Label>
                        </td>
                        <td bgcolor="#CCCCCC"><asp:TextBox Width="675" ReadOnly="true" Rows="9" TextMode="MultiLine" ID="LabelPost" runat="server" Text='<%# Eval("p_content") %>' Enabled="False" ForeColor="Black"/></td>
                    </tr>
                    <tr>
                        <td colspan="2">
                            <table width="100%">
                                <tr valign="middle">
                                    <td width="200" align="left"><asp:Label ID="labelEdited" runat="server"/><% changeDate(); %></td>
                                    <td width="200" align="center"><asp:HyperLink Visible="false" ID="b0" runat="server" Text="Edit"><img src="../Pic/buttonedit.png" width="20%"/></asp:HyperLink> <%changeLink(); %></td>
                                    <td width="200" align="right"><asp:Label ID="Label5" runat="server" Text='<%# Eval("p_created", "{0:g}") %>'/></td>
                                </tr>
                            </table>  
                        </td>
                    </tr>
                </table>
                </ItemTemplate>
            </asp:TemplateField>          
        </Columns>
    </asp:GridView>

Und der Code wie ich auf das GridView via Code-behind File zugreife und Daten ändere ():


public void insertPic()
    {
        GridView gv = GridView1;
        Image u = null;
        foreach (GridViewRow gvr in gv.Rows)
        {
            foreach (TableCell tc in gvr.Cells)
            {
                Label x = (Label)tc.FindControl("labelUser");
                String user = x.Text;
                u = (Image)tc.FindControl("imgUser");

                var result = from a in db.u_users
                             where a.u_username.Equals(user)
                             select a;

                if (result.First().u_picture != null)
                    u.ImageUrl = result.First().u_picture;
            }
        }
    }

Im Grunde funktioniert das auch, jedoch funktioniert es für das erste Element nicht (Auch getestet mit Paging: Es funktioniert jeweils das erste Element auf jeder Page nicht). Hier ein Screenshot zur Verdeutlichung:

Klick

Man sieht, dass der Edit Button und das Profilbild nicht existieren bzw. auf den Default Werten sind. Natürlich habe ich getestet, ob er in der foreach in der Row[0] reingeht und es funktioniert.

Ich verstehe einfach nicht warum die Werte für das erste Element nicht übernommen werden. Habt ihr Fehler/Lösungsansätze für mich?

MfG
Chris

S
10 Beiträge seit 2012
vor 11 Jahren

Hallo Cr95is,

Leider kann ich dir auch nicht sagen, wo die Ursache für dein Problem liegt.
Möglicherweise ist der Fehler bei der Datenquelle des GridViews zu suchen.
Ich vermute, es handelt sich dabei um die Tabelle einer Datenbank.

Grundsätzlich stellt sich mir die Frage, warum die Daten (z.B. den Url zum User-Bild und vermutlich noch einige andere in den Funktionen changeLink() und changeDate()), die du auf so komplizierte und zeitraubende Weise nachträglich ermittelst, nicht von vornherein Teil der Datenquelle des GridViews sind ?

Dies könnte z.B. durch einen Join der Tabellen u_users und der Tabelle "wasweissich" (vmtl. "Userposts" oder so...), die Datenquelle des Gridviews ist, erreicht werden.

Dann wäre das nachträgliche Ändern des GridViews unnötig und du sparst massenweise Datenbankzugriffe ein.
Vielleicht verschwindet auf diese Weise auch dein Problem. 😁

Grüße,

Christoph

C
Cr95is Themenstarter:in
3 Beiträge seit 2012
vor 11 Jahren

Hallo Christoph,

danke für die hilfreiche Antwort.

Das Bild funktioniert jetzt (mit dem vorgeschlagenem Join - hätte ich mir auch selber denken können 😃 )

Die Methoden changeLink() (Dient zum Herausfinden ob der Edit-Button angezeigt werden soll oder nicht, da nur der User der den Post erstellt hat, ein Moderator oder Admin editieren darf) und changeDate() (Dient zum Herausfinden ob der Post editiert wurde und wenn ja wann zum letzten mal und von wem) implementiere ich über das Code-Behind-File, weil die Daten relativ kompliziert in mehreren Tabellen abgespeichert sind.

MfG
Chris