W jednej z moich tabel mam trzy pola: id, tytuł, treść
Jeśli połączę dane tabeli z GridView
, chcę mieć łącze do tytułu przy użyciu formatu displaycontent.aspx?id='id'.
Moje pytanie brzmi, czy nie pokazuję pola id w widoku siatki, którego nie wiążę z polem id. Jak mogę uzyskać wartość identyfikatora w zdarzeniu datarowbind?
3 odpowiedzi
Myślę, że możesz zrobić coś takiego:
NavigationUrl='displaycontent.aspx?id=<%#Eval("Id")%>'
I nie musisz wiązać kolumny Id
Nie testowałem, ale jestem pewien, że taki jest pomysł.
Wystarczy utworzyć pole szablonu i zlokalizować wszystkie dostosowania powiązania ze zdarzeniem OnDataBinding
kontrolki. Z jakiegoś powodu większość ludzi robi to podczas wydarzenia RowDataBound
, którego nie polecam. Nie ma powodu, aby szukać kontrolek za pomocą kontrolek DataBinding, a także umożliwia zlokalizowanie dostosowań i łatwą ich zamianę bez konieczności wpływania na cokolwiek innego. Wyobraź sobie, że masz 20 elementów sterujących w swojej siatce, które wymagają pewnego rodzaju dostosowań DataBinding
. Twoje wydarzenie RowDataBound
byłoby bałaganem i musiałbyś wiedzieć o wszystkim w siatce, co może być łatwo zabugowane.
Przykład:
<asp:TemplateField>
<ItemTemplate>
<asp:HyperLink runat="server" ID="lnkYourLink"
OnDataBinding="lnkYourLink_DataBinding" />
</ItemTemplate>
</asp:TemplateField>
W Codebind:
protected void lnkYourLink_DataBinding(object sender, System.EventArgs e)
{
HyperLink lnk = (HyperLink)(sender);
lnk.Text = Eval("Title").ToString();
lnk.NavigateUrl = string.Format("displaycontent.aspx?id={0}",
Eval("ID").ToString())
}
Wolę tę metodę również od kodu wbudowanego, ponieważ nie zaśmieca ona również znaczników żadną logiką. Jeśli następnego dnia potrzebujesz LinkButton
, możesz go łatwo zamienić bez dotykania żadnego innego kodu, który nie jest związany z HyperLink
.
Można to zrobić na kilka sposobów. W tym celu nie musisz subskrybować wydarzenia RowDataBound
.
Potrzebujesz kolumny TemplateField
, która zawiera UserControl, który wystarcza do Twoich potrzeb (HyperLink
, LinkButton
, lub cokolwiek)
Załóżmy, że Twoja kolumna szablonów wygląda tak:
<asp:TemplateField>
<ItemTemplate>
<asp:HyperLink runat="server" ID="hlContent" Text="Details" />
</ItemTemplate>
</asp:TemplateField>
Możesz mieć wiązanie danych w znacznikach, jak zasugerował Icarus. Oznacza to, że Twój HyperLink będzie wyglądał tak (nieprzetestowany):
<asp:HyperLink runat="server" ID="hlContent" Text="Details" />
Inną opcją byłoby użycie wydarzenia RowDataBound
, o które prosiłeś w swoim pytaniu:
protected void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e)
{
if(e.Row.RowType == DataControlRowType.DataRow) // neccessary to differentiate between content, header and footer
{
HyperLink hlContent = e.Row.FindControl("hlContent") as HyperLink;
YourObject dataItem = e.Row.DataItem as YourObject; // Depending on what datatype your e.Row.DataItem is. Take a look at it which the QuickWatch
hlContent.NavigateUrl = String.Format("displaycontent.aspx?id={0}", dataitem.id);
}
}
Edytuj: po opublikowaniu kilku odpowiedzi na temat korzystania ze zdarzenia RowDataBound, postanowiłem napisać artykuł, który je opisuje: http://www.tomot.de/en-us/article/7 /asp.net/gridview-przegląd-różnych-sposobów-wiązania-danych-do-kolumn
Podobne pytania
Nowe pytania
asp.net
ASP.NET to platforma programistyczna firmy Microsoft do tworzenia aplikacji internetowych, która umożliwia programistom tworzenie dynamicznych witryn internetowych, aplikacji internetowych i usług internetowych. Przydatne jest używanie tego tagu w połączeniu ze znacznikiem typu projektu, np. [asp.net-mvc], [asp.net-webforms] lub [asp.net-web-api]. NIE używaj tego tagu w przypadku pytań dotyczących ASP.NET Core - zamiast tego użyj [asp.net-core].