![]() |
|
|
|||||||
| .NET I detta forum diskuteras ämnen som berör .NET-plattformen, bland annat asp.net. |
![]() |
|
|
Trådverktyg | Visningsalternativ |
|
|
#1 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Ny på ASP.net söker svar på...
Hej, i "gamla" ASP kunde man använda sig av scriptlets typ. <% rs("ssd") %>
Men i .net verkar man endast använda sig av olika kontroller typ Datagrid m.fl. I asp hade man total kontroll på layout i.o.m. man kunde verkligen specificera var fälten/i vilken cell datat från DB skulle skrivas ut men i .net verkar man vara utelämnad till att justera och designa dessa kontroller! Har jag fel och i så fall hur gör man bäst för att kontrollera layouten?
|
|
|
|
|
|
#2 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Bäst gör du genom att antingen hålla dig till Repeaters för dataloopar och literals för annat, eller genom att använda dig av ASP.NET MVC Framework
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#3 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Har du något exempel på repeater? Jag antar att literals bara kan ta en post från databasen?!
|
|
|
|
|
|
#4 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Här ser du ett exempel på hur jag brukar göra
http://blog.crswebb.se/post/2008/09/...llections.aspx
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#5 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Men om jag nu skulle vilja ta fram ett värde på en funktion/metod mitt i repeatern?! Hur gör jag då??
Kod:
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate><table border="1"></HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#DataBinder.Eval(Container.DataItem, "BilID") %>
</td>
<td>
<%#DataBinder.Eval(Container.DataItem, "Bilnamn") %>
</td>
<td>[Här vill jag ta fram ett värde från metoden retInt()]</td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
|
|
|
|
|
|
#6 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Jag skulle (nog) ha lagt en Literal där, och i eventet ItemDataBound för Repeatern hämtat datat, letat på Repeatern och lagt dit infon
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#7 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Jag försökte lägga dit en literal men det verkar inte gå att lägga in en mitt i ett annan kontroll?!
Kod:
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate><table border="1"></HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#DataBinder.Eval(Container.DataItem, "BilID") %>
</td>
<td>
<%#DataBinder.Eval(Container.DataItem, "Bilnamn") %>
</td>
<td><asp:Literal ID="Literal2" runat="server"></asp:Literal></td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
|
|
|
|
|
|
#8 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Nej, jag skrev fel. "letat på repeatern" menade jag "letat på litaral"
((Literal)e.Item.FindControl("Literal2")).Text = "text"; Det borde fungera om din RepeaterEventArgs i ItemDataBound heter e
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#9 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Nej, jag vet inte riktigt hur du menar men detta verkar väldigt komplicerat, bara för att ta fram data från 2 olika källor inom samma kontroll!
|
|
|
|
|
|
#10 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Nejdå, det är inte alls komplicerat när man väl har förstått hur det hänger ihop.
Kan du visa lite kod, hur du har försökt lösa det?
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#11 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Detta är Default.aspx.cs
Kod:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Odbc;
using System.Data;
namespace Testapplikation
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Classe cl = new Classe();
Repeater1.DataSource = cl.valjAlltFranBilar();
Repeater1.DataBind();
//Literal2.Text = cl.retInten(45, 21, 87).ToString();
}
}
}
Detta är en fil som jag döpte till Classe bara för att testa om det gick att skapa egna klassobjekt till att göra nya instanser av, typ! Kod:
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.Odbc;
using System.Data;
namespace Testapplikation
{
public class Classe
{
public OdbcDataReader valjAlltFranBilar()
{
OdbcConnection myConnection = new OdbcConnection("Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\Testdatabas.mdb");
OdbcCommand myCommand = new OdbcCommand("Select * from Bilar", myConnection);
myConnection.Open();
return myCommand.ExecuteReader(CommandBehavior.CloseConnection);
myConnection.Close();
}
public int retInten(int a, int k, int b)
{
b = a * k;
return b;
}
}
}
Detta är Default.aspx Kod:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Testapplikation._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Tomas test med databaser</title>
<style type="text/css">
.style1
{
height: 204px;
}
</style>
</head>
<body>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate><table border="1"></HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#DataBinder.Eval(Container.DataItem, "BilID") %>
</td>
<td>
<%#DataBinder.Eval(Container.DataItem, "Bilnamn") %>
</td>
<td>
<asp:Literal ID="Literal2" runat="server"></asp:Literal></td>
</tr>
</ItemTemplate>
<FooterTemplate></table></FooterTemplate>
</asp:Repeater>
<asp:Literal ID="Literal1" runat="server"></asp:Literal>
</body>
</html>
|
|
|
|
|
|
#12 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Japp, du måste skapa ett Repeater_ItemDataBound-event till din repeater, i den ska du lägga följande kod:
if (e.Item.ItemType==ItemType.AlternatingItem || e.Item.ItemType==ItemType.Item) { ((Literal)e.Item.FindControl("Literal2")).Text = "text"; }
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#13 |
|
Medlem
Registrerad: 2001-11-07
Ort: Uppsala
Inlägg: 1 041
Lösningar: 13 |
Hallå
Jag skulle, som en parantes, rekommendera dig att titta på Listviewkontrollen istället för repeater om du använder 3.5 ramverket den är väldigt dynamisk men mycket kraftfullare än repeatern. Det är enklare att manipulera data i en listview. Här kan du läsa lite om den: http://www.singingeels.com/Articles/..._Repeater.aspx
__________________
På stenåldern betydde vegetarian "värdelös jägare"! |
|
|
|
|
|
#14 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Hej igen! Det verkar väldigt komplicerat att få fullständig kontroll på datat utan en massa extra. Kan jag själv kontrollera var datat hamnar ifall jag använder listview?
Jag fick inte riktigt ihop artikeln! EDIT: Nu fattar jag kanske, ska testa i morgon! |
|
|
|
|
|
#15 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Hopparn, på vilket sätt menar du att ListView skulle ge bättre kontroll över den renderade html-koden än en Repeater?
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#16 | |
|
Medlem
Registrerad: 2001-11-07
Ort: Uppsala
Inlägg: 1 041
Lösningar: 13 |
Citat:
![]() Jag menade att du har lättare att manipulera data i en listview med t ex datakeys och edititemtemplates och events som finns tillgängliga. Att behålla positioner vid postbacks etc, samtidigt som du har 100% kontroll över din rendering. Alltså som en repeater med gridviewkunskaper(och mer därtill) Som ett litet exempel med nästlade listviews med edit och insert för att du ska förstå vad jag menar, jag har tagit bort en del kod och bytt lite namn för att inte visa, så det fungerar inte rakt av men konceptuellt: Kod:
<asp:ListView runat="server"
DataKeyNames="CategoryId"
ID="lvCategories"
OnItemDataBound="ItemBound"
OnItemEditing="EditItem"
OnItemCanceling="CancelEditing"
OnItemInserting="InsertItem"
OnItemUpdating="UpdateItem"
OnItemDeleting="DeleteItem"
InsertItemPosition="None">
<LayoutTemplate>
<table id="Itemcategories" runat="server" class="grid">
<tr class="row">
<th class="first">Category</th>
<th>Active</th>
<th> </th>
</tr>
<tr class="row" id="itemPlaceholder" runat="server" />
</table>
</LayoutTemplate>
<ItemTemplate>
<tr id="row" runat="server">
<td class="first"><%# Eval("Name")%></td>
<td><%# Page.ReturnYesNo((bool)Eval("Active"))%></td>
<td>
<asp:ImageButton ID="EditButton" runat="server" CommandName="Edit" ImageUrl="~/Images/Icons/edit.gif" Visible="true" AlternateText="Edit" ToolTip="Edit" />
<asp:ImageButton ID="DeleteButton" runat="server" CommandName="Delete" ImageUrl="~/Images/Icons/del.gif" OnClientClick="return confirm('Do you really want to delete this item?');" Visible="true" AlternateText="Delete" ToolTip="Delete" />
</td>
</tr>
</ItemTemplate>
<EditItemTemplate>
<tr id="row" runat="server">
<td class="first"><asp:TextBox ID="tbName" runat="server" Text='<%# Eval("Name")%>' /></td>
<td><asp:CheckBox ID="cbActive" runat="server" Checked='<%#Eval("Active") %>' /></td>
<td>
<asp:Button ID="UpdateButton" runat="server" CssClass="genericButton" CommandName="Update" Text="Update" />
<asp:Button ID="CancelButton" runat="server" CssClass="genericButton" CommandName="Cancel" Text="Cancel" />
</td>
</tr>
<!-- Items -->
<tr runat="server" id="ItemsRow">
<td colspan="3" class="subgridcol first" style="padding: 10px 0 0 20px;border-top:none">
<h2>Items in category</h2>
<asp:LinkButton runat="server" ID="lbAddItem" Text="Add new item" OnClick="lbAddItem_Click"></asp:LinkButton>
</td>
</tr>
<asp:ListView runat="server"
DataKeyNames="ItemId"
ID="lvItems"
OnItemEditing="ItemEdit"
OnItemCanceling="CancelEditing"
OnItemInserting="ItemInsert"
OnItemUpdating="ItemUpdate"
InsertItemPosition="None"
OnItemDeleting="ItemDelete"
OnItemDataBound="ItemDataBound">
<LayoutTemplate>
<tr id="Tr1" runat="server" class="subgridrow">
<td colspan="3" class="subgridcol first">
<table class="grid">
<tr>
<th class="first">Name</th>
<th>Type</th>
<th>Pricetype</th>
<th>Amount (inc VAT)</th>
<th>VAT</th>
<th> </th>
</tr>
<tr class="row" id="itemPlaceholder" runat="server" />
</table>
</td>
</tr>
</LayoutTemplate>
<ItemTemplate>
<tr id="row" runat="server">
<td class="first"><%# Eval("Name")%></td>
<td><%#Eval("Type")%></td>
<td><%#Eval("PriceType")%></td>
<td><%# Eval("Amount")%> <%#Page.Currency %></td>
<td runat="server" id="tdVat"><%# Eval("VAT")%> %</td>
<td>
<asp:ImageButton ID="EditButton" runat="server" CommandName="Edit" ImageUrl="~/Images/Icons/edit.gif" Visible="true" AlternateText="Edit" ToolTip="Edit" />
<asp:ImageButton ID="DeleteButton" runat="server" CommandName="Delete" ImageUrl="~/Images/Icons/del.gif" OnClientClick="return confirm('Do you really want to delete this item?');" Visible="true" AlternateText="Delete" ToolTip="Delete" />
</td>
</tr>
</ItemTemplate>
<EditItemTemplate>
<tr id="row" runat="server">
<td class="first"><asp:TextBox ID="tbItemName" runat="server" Text='<%# Eval("Name")%>' /></td>
<td><asp:DropDownList ID="ddType" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddType_SelectedIndexChanged" /></td>
<td><asp:DropDownList ID="ddPriceType" runat="server" /></td>
<td><asp:TextBox ID="tbItemAmount" runat="server" Text='<%# Eval("Amount")%>' /> <%#Page.Currency %></td>
<td><asp:TextBox ID="tbItemVAT" runat="server" Text='<%# Eval("VAT")%>' /><asp:Literal runat="server" ID="litPerc" Text="%"></asp:Literal></td>
<td>
<asp:Button ID="UpdateButton" runat="server" CssClass="genericButton" CommandName="Update" Text="Update" />
<asp:Button ID="CancelButton" runat="server" CssClass="genericButton" CommandName="Cancel" Text="Cancel" />
</td>
</tr>
</EditItemTemplate>
<InsertItemTemplate>
<tr id="row" runat="server">
<td class="first"><asp:TextBox ID="tbItemName" runat="server" /></td>
<td><asp:DropDownList ID="ddType" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddType_SelectedIndexChanged" /></td>
<td><asp:DropDownList ID="ddPriceType" runat="server" /></td>
<td><asp:TextBox ID="tbItemAmount" runat="server" /> <%#Page.Currency %></td>
<td><asp:TextBox ID="tbItemVAT" runat="server" /><asp:Literal runat="server" ID="litPerc" Text="%"></asp:Literal></td>
<td>
<asp:Button ID="InsertButton" runat="server" CssClass="genericButton" CommandName="Insert" Text="Add item" />
<asp:Button ID="CancelButton" runat="server" CssClass="genericButton" CommandName="Cancel" Text="Cancel" />
</td>
</tr>
</InsertItemTemplate>
</asp:ListView>
</EditItemTemplate>
<InsertItemTemplate>
<tr id="row" runat="server">
<td class="first"><asp:TextBox ID="tbName" runat="server" /></td>
<td><asp:CheckBox ID="cbActive" runat="server" /></td>
<td>
<asp:Button ID="InsertButton" runat="server" CssClass="genericButton" CommandName="Insert" Text="Add" />
<asp:Button ID="CancelButton" runat="server" CssClass="genericButton" CommandName="Cancel" Text="Cancel" />
</td>
</tr>
</InsertItemTemplate>
</asp:ListView>
__________________
På stenåldern betydde vegetarian "värdelös jägare"! Senast redigerad av hopparn, 2009-12-09 klockan 07:49 |
|
|
|
|
|
|
#17 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Och om mitt visual studio inte fattar vad Item eller ItemType är för något vad har jag gjort för fel då?
|
|
|
|
|
|
#18 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
ListItemType.Item
Eventuellt måste du lägga till using System.Data; överst i din fil
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#19 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Error 2 The name 'ItemType' does not exist in the current context
Jag har using System.Data; längst upp nu. |
|
|
|
|
|
#20 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Error 1 'System.EventArgs' does not contain a definition for 'Item' and no extension method 'Item' accepting a first argument of type 'System.EventArgs' could be found (are you missing a using directive or an assembly reference?) C:\C#\Testapplikation\Testapplikation\Default.aspx.cs 23 19 Testapplikation
Error 3 'System.EventArgs' does not contain a definition for 'Item' and no extension method 'Item' accepting a first argument of type 'System.EventArgs' could be found (are you missing a using directive or an assembly reference?) C:\C#\Testapplikation\Testapplikation\Default.aspx.cs 23 66 Testapplikation Error 5 'System.EventArgs' does not contain a definition for 'Item' and no extension method 'Item' accepting a first argument of type 'System.EventArgs' could be found (are you missing a using directive or an assembly reference?) C:\C#\Testapplikation\Testapplikation\Default.aspx.cs 25 29 Testapplikation |
|
|
|
|
|
#21 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
En fråga. Det finns inte något sätt att exekvera koden i .cs-filen för att sedan hämta upp data i aspx-filen inom en scriptlets? Typ <%= Request.???(DataObjectSomething("ID")) %>
Eller måste man alltid binda data till en kontroll, typ repeater? |
|
|
|
|
|
#22 |
|
Medlem
Registrerad: 2004-09-24
Ort: Hedemora
Inlägg: 752
Lösningar: 37 |
Du måste inte binda till en kontroll, men det är SÅÅ mycket bättre.
Du har definerat att ditt ItemDataBound-event tar emot ett EventArgs-objekt. Det är inte fel, men det innehåller inte de specifika Repeater-egenskaperna. Du vill istället använda ett RepeaterEventArgs-objekt
__________________
webbdesign | skoj | filmrecensioner | sportnyheter | tekniknyheter | besikta bilen | köpa kattunge |
|
|
|
|
|
#23 |
|
Medlem
Registrerad: 2005-02-08
Ort: Södermalm
Inlägg: 282
Lösningar: 24 |
Du kan mycket väl köra ett metodanrop i repeatern
typ <%# GetMyStringFromMyObject(Container.DataItem) %> o sen får du bara casta objektet till vad det är o returnera nån lämplig sträng kanske protected string GetMyStringFromMyObject(Object obj) { DataRow row = obj as DataRow; // ev DataRowView minns inte vilket string hupp = row["Rostskada"] as string; if(hupp != null && hupp == "ja) return "Rostskadad"; return "Som ny"; } fördelen är att di slipper få ett element med fult .net ID :-) |
|
|
|
|
|
#24 |
|
Medlem
Registrerad: 2007-10-08
Inlägg: 420
Lösningar: 23 |
Annars kan man ju titta på Asp.NET MVC där man då inte har några kontroller alls utan får skriva gamla hederliga for-loopar för att få ut sin data (och en hel del andra fördelar)
|
|
|
|
|
|
#25 |
|
Medlem
Registrerad: 2004-07-13
Inlägg: 307
Lösningar: 0 |
Ja nu fungerar det men inte så smidigt som man kan tro! Hur gör man så om man skulle vilja blanda data från 2 tabeller eller rent av 2 databaser i samma repeater. Är det tänkt att SQLkoden ska lösa det eller finns det något sätt att binda till repeatern?!
|
|
|
|
![]() |
| Trådverktyg | |
| Visningsalternativ | |
|
|