webForumDet fria alternativet

Repeater och uppdatering

.NET

15 svar · 727 visningar · startad av fredrik

Medlem sedan dec. 19991 072 inlägg
Frågan#1

Jag har en sida där jag utifrån en databas listar poster i en Repeater.

Vid klick på en post visas postens data direkt under i en trädliknande struktur. Jag vill inte att sidan ska laddas om, utan jag skapar trädet mha Dynamisk HTML.

Detta är i sig inget problem, utan det är redan gjort. I varje Repeater-Item skriver jag alltså ut HTML-kod för både posten och sen dess data som dock ligger i en dold <SPAN>.

Jag vill även ha en editering för datan vilket också ska ligga i Dynamisk HTML. Så i varje repeater-Item lägger jag även ut en <SPAN> med <asp:Textbox> kontroller. Jag lägger även för varje Data-del ut en <asp:Button> som jag med OnClick kopplar till en händelse i CodeBehind.

I DataBound-eventet för Repeatern lägger jag sen som CommandArgument för knappen till vilket ItemIndex i Repeatern knappen ligger under.

....och vid klick på knappen hämtar jag via Repeaterns Item (ItemIndex från CommandArgument) ut Textbox-kontrollerna. Jag gör alltså FindControl i den aktuella "Repeater-Item" för att hitta kontrollerna.

Infon postas sen mot databasen.

Allting funkar kanon, frågan är: Är detta ett bra sätt?

...eller bör jag använda en DataGrid, eller blir det för meckigt att använda dess Editerings-möjligheter för att få det att se ut precis som jag vill? (Jag har en hel del javascript-kontroller).

Hoppas ni hänger med på hur jag har gjort!

Medlem sedan juni 20011 732 inlägg
#2

En datagrid ska ju vara lite snabbare, speciellt om man använder de inbyggda editeringsfunktionerna. Med templates så har du ju möjlighet att lägga in egen kod så det borde väl inte vara omöjligt att konvertera, tror inte det blir meckigt alls. Å andra sidan så tappar man väl den där extra prestandan när man använder templates om jag förstått det hela rätt (någon som kan verifiera?) så behöver du inte datagridens extra features så tror jag inte att du vinner något alls. If it ain't broken... :)

Medlem sedan dec. 19991 072 inlägg
#3

Ok, Tack för svaret!

Alltså, så kan jag utan att känna att jag byggt "felaktig" eller prestanda-mässigt dålig kod, behålla det jag redan gjort.

Medlem sedan dec. 20003 563 inlägg
#4

If it ain't broken...

Skulle nog köra på uttalande.

Jag körde för ett tag sen en massa tester kring datagrid, repeater, datalist samt olika kombinationer vad gäller templates kopplad till datagriden.
Kortfattat så kom jag fram till att använd den simplaste lösningen tills då du skall använda de funktioner som finns i t.ex. datagriden.

ex. Loopa ut innehåll i en repeater. Behöver du gör det i en tabell? Använd datalist!
Skall du kunna redigera informationen? Lägg i datagrid!

Medlem sedan dec. 19991 072 inlägg
#5

Skall du kunna redigera informationen? Lägg i datagrid!

Jag ska ju kunna redigera informationen, men jag vill inte använda en tabell...

Hur funkar det?

Medlem sedan juni 20011 732 inlägg
#6

fredrik skrev:

Alltså, så kan jag utan att känna att jag byggt "felaktig" eller prestanda-mässigt dålig kod, behålla det jag redan gjort.

En repeater är inte något dåligt alternativ prestandamässigt, faktum är att det är väldigt bra snurr på allihop. Det kritiska är vad man gör i dem och hur man gör det men kontrollen i sig är ingen flaskhals.

Medlem sedan dec. 19991 072 inlägg
#7

Ok, ja det låter ju bra. Jag får nöja mig med dessa svar och får helt enkelt se hur prestandan blir i en stress-test/live.

Tack!

Medlem sedan maj 20012 812 inlägg
#8

En datagrid ska ju vara lite snabbare

Hoppas du inte menar att DataGriden skall vara snabbare än repeatern. För så är verkligen inte fallet.

Det absoult snabbaste sättet att presentera data på (om man inte använder caching) är att binda en DataReader till en Repeater. Snabbare än så blir det inte.

Sedan om man skall börja använda sig av olika funktioner som Editer/paging osv osv. Så kan man först börja att titta på DataList och sedan DataGriden.

DataGriden är den servercontrol som har mest overhead och är därmed långsammast på att bara presentera data. Men den fyller sin funktion för andra saker.

- M

Medlem sedan juni 20011 732 inlägg
#9

Har åtminstone för mig att jag läst att en datagrid är det snabbaste alternativet när du ska uppdatera/redigera data. En repeater är dessutom alltid latebound, om du har en boundcolumn i din datagrid så gör du väl inte det?

Vad gäller overhead så kan jag inte tänka mig att det är något som påverkar prestandan om du inte använder den funktionaliteten?

Medlem sedan juni 20011 732 inlägg
#10

Verkar som du har rätt, Gladh. :)

Performance wise, you must always use a Repeater wherever possible. It is the fastest control out of the three. Unfortunately, it is also very limited in what it can do. All a repeater can do is iterate through the data source and display its properties.

A data source can be a data object such as a DataReader or dataset, but it can also be your custom collection that implements the IEnumerable and/or the IEnumerator interface. This is very good for displaying read only items such as list of news headlines, a summary of recent articles, etc.

There are times when you want to be able to "select" a row. When the row is selected, you want different item templates to be displayed. This situation is when you use a data list. DataLists allow you to select a row and display data using different templates. This is very useful for items that might need some frequent modification such as a list of news headlines for administrators where you want administrators to be able to edit headlines, etc.

The DataGrid is an interesting control. I always use it when I have a dataset as my data source. Although it's really slow, it is very flexible. It's also capable of producing a professional looking list or grid automatically. It knows the database's schema. It knows the type of fields and displays them accordingly. But one of the best features it has is its ability to allow editing of the data without having us code any postback functions, etc.

I find it great for administrative sections as it is not used very often but offers the greatest flexibility and convenience. If you need the greatest performance possible, however, then don't use a DataGrid.

Källa: http://www.developerfusion.com/show/3058/3/

Medlem sedan juni 20011 732 inlägg
#11

En väldigt beskrivande artikel i ämnet hittar ni här:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/aspnet-whenusedatawebcontrols.asp

Medlem sedan maj 20012 812 inlägg
#12

Klart jag har rätt :-)

En repeater är dessutom alltid latebound, om du har en boundcolumn i din datagrid så gör du väl inte det?

Om man använder sig av det ja. Själv binder jag alltid mina data i onItemDataBound() Eventet och då slipper jag latebinding och reflextion i min Repeatern.

Vad gäller overhead så kan jag inte tänka mig att det är något som påverkar prestandan om du inte använder den funktionaliteten?

Du behöver inte använda dig av de funktioner för att de skall påverka prestandan, det görs ändå. För ioch med att du har möjlighet att använda dem, så måste en massa saker instansieras när din datagrid instansieras, sedan spelar det ingen roll om du tänker använda det eller ej, det har redan tagit tid att instansiera alla dessa grejer.

Men DataGrider har som sagt sin funktion, men ur ren prestanda synpunkt så suger den Fett likaså DataSetet.

Så för bäst prestanda: Repeater med DataReader
för sämst prestanda: DataGriden med DataSet

- M

Medlem sedan dec. 19991 072 inlägg
#13

Själv binder jag alltid mina data i onItemDataBound() Eventet

Gladh: Har du nåt snabbt/enkelt exempel som visar detta?

Medlem sedan maj 20012 812 inlägg
Medlem sedan dec. 20003 887 inlägg
#15

databound.aspx

<%@ Page Src="databound.aspx.cs" Inherits="CTest" %>

<asp:Repeater id="objRepeat" OnItemDataBound="objRepeat_DataBound" runat="server">
  <ItemTemplate>
    <asp:Label id="lblData" runat="server"/>
  </ItemTemplate>
</asp:Repeater>

databound.aspx.cs

public class CTest : Page
{
  protected System.Web.UI.WebControl.Label lblData;

  public void objRepeat_DataBound(object objSrc, EventArgs e)
  {
    if(e.Item.ItemStyle == ListItemStyle.Item || e.Item.ItemStyle == ListItem.AlternatingItem)
    {
      ((Label) e.Item.FindControl("lblData").Text = ((DataRowView) e.Item.DataItem)["[i]kolumnnamn[/i]"].ToString();
    }
  }

  private void Page_Load(object objSrc, EventArgs e)
  {
    DataTable objDT = new DataTable();
    OleDbConnection oleConnection = new OleDbConnection([i]ConnectionString[/i]);
    OleDbDataAdapter oleAdapter = new OleDbDataAdapter();

    oleAdapter.SelectCommand = new OleDbCommand("SELECT * FROM tabell", oleConnection)
    oleAdapter.Fill(objDT)

    lblData.DataSource = objDT.DefaultView;
    lblData.DataBind();
  }
}

Hade lite å göra... vet inte ens om det fungerar :)

Medlem sedan jan. 200454 inlägg
#16

En fråga på detta ovan. Jag önskar bara presentera EN rad från databasen på en helsida, men vill ändå kunna redigera denna (T.ex. ändra ett textstycke som laddas från databasen). Ska man då använda DataList/DataGrid ändå? Finns det något smartare sätt?

Det känns som DataList/DataGrid/Repeater är till för när man skall lista många rader från databasen och "redigera" en av dessa rader..

PS. jag tror jag läst till mig det enda rätta..

LÖST!

262 ms totalt · 3 externa anrop · v20260731065814-full.767b4345
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)