A ListView kétszer mondja. A ListView kétszer mondja.

Az ASP.NET ListView vezérlő sajnos a csillagok bizonyos együttállása esetén kétszer fordul az adatbázishoz. Látszólag nincs semmi extra a dologban, mégis SQL Profilerrel megnézve tisztán látszik, hogy a kapcsolt SqlDataSource SelectCommand utasítása kétszer fut be az adatbázis szerverbe.

Szerencsére ez nem mindig fordul elő, akkor azonban biztosan, ha a ListViewt beágyazzuk egy Web User Controlba (ascx), majd az beletesszük egy adatkötött vezérlőbe, például egy FormView-ba. Tehát a szerencsétlen csillagállás:

Page –> FormView –> FormView.ItemTemplate –> Web User Control –> ListView

A problémát az okozza, hogy a ListView inicializálásakor is történik egy adatkötés és a FormView is meghívja rajta a DataBind metódust. Sajnos nem ez az egyetlen adatkötési gond a ListView-val, kész csoda, hogy nem száll el StackOverflowExceptionnel.

Megoldás

Aki teljesen biztos magában, megoldhatja a fenti problémát azzal, hogy a FormViewtól érkező DataBindot nem engedi lefolyni a ListViewra, lehet például ezt írni a Web User Controlba:

  public override void DataBind()
  {
    // Kikommentezve: base.DataBind();
  }

Aki kevésbé merész, vagy szüksége van az ASCX DataBind metódusára, az keresztbetehet az Initben lezajló adatkötésnek azzal, hogy csak később, a Page_Loadban állítja be a ListView adatforrását, például így:

  protected void Page_Load( object sender, EventArgs e )
  {
    this.ListView1.DataSource = this.SqlDataSource1;
  }

Egyelőre úgy tűnik, hogy a probléma csak a ListView vezérlőt érinti, a Repeaterrel nincs gond.

A hibás működést és a javítást tartalmazó példa kód letölthető innen.

Technorati-címkék: ,,,

Reklámok

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s