webForumDet fria alternativet

Ny på ASP.net söker svar på...

.NET

27 svar · 1 942 visningar · startad av Sunix

Medlem sedan juli 2004310 inlägg
Frågan#1

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? :)

Medlem sedan sep. 2004828 inlägg
#2

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

Medlem sedan juli 2004310 inlägg
#3

Har du något exempel på repeater? Jag antar att literals bara kan ta en post från databasen?!

Medlem sedan sep. 2004828 inlägg
#4

Här ser du ett exempel på hur jag brukar göra
http://blog.crswebb.se/post/2008/09/26/Att-anvanda-egna-Collections.aspx

Medlem sedan juli 2004310 inlägg
#5

Men om jag nu skulle vilja ta fram ett värde på en funktion/metod mitt i repeatern?! Hur gör jag då??

 <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>[B][Här vill jag ta fram ett värde från metoden retInt()][/B]</td>
    </tr>
    </ItemTemplate>
    <FooterTemplate></table></FooterTemplate>
    
    </asp:Repeater>
Medlem sedan sep. 2004828 inlägg
#6

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

Medlem sedan juli 2004310 inlägg
#7

Jag försökte lägga dit en literal men det verkar inte gå att lägga in en mitt i ett annan kontroll?!

<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>[B]<asp:Literal ID="Literal2" runat="server"></asp:Literal>[/B]</td>
    </tr>
    </ItemTemplate>
    <FooterTemplate></table></FooterTemplate>
    
    </asp:Repeater>

Error 1 The name 'Literal2' does not exist in the current context C:\C#\Testapplikation\Testapplikation\Default.aspx.cs 21 13 Testapplikation

Medlem sedan sep. 2004828 inlägg
#8

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

Medlem sedan juli 2004310 inlägg
#9

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!

Medlem sedan sep. 2004828 inlägg
#10

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?

Medlem sedan juli 2004310 inlägg
#11

Detta är Default.aspx.cs

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!

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

<%@ 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>
Medlem sedan sep. 2004828 inlägg
#12

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";
}

Medlem sedan nov. 20011 551 inlägg
#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/The_ListView_Dominates_The_Repeater.aspx

Medlem sedan juli 2004310 inlägg
#14

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!

Medlem sedan sep. 2004828 inlägg
#15

Hopparn, på vilket sätt menar du att ListView skulle ge bättre kontroll över den renderade html-koden än en Repeater?

Medlem sedan nov. 20011 551 inlägg
#16

StefanBergfeldt skrev:

... skulle ge bättre kontroll över den renderade html-koden än en Repeater?

Det menade jag inte :)
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:

    <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>&nbsp;</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>&nbsp;</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>
Medlem sedan juli 2004310 inlägg
#17

Och om mitt visual studio inte fattar vad Item eller ItemType är för något vad har jag gjort för fel då?

Medlem sedan sep. 2004828 inlägg
#18

ListItemType.Item

Eventuellt måste du lägga till using System.Data; överst i din fil

Medlem sedan juli 2004310 inlägg
#19

Error 2 The name 'ItemType' does not exist in the current context
Jag har using System.Data; längst upp nu.

Medlem sedan juli 2004310 inlägg
#20

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

262 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)