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?

0
Steven Zack 23 sierpień 2011, 23:47

3 odpowiedzi

Najlepsza odpowiedź

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ł.

1
Icarus 23 sierpień 2011, 23:52

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.

2
Kelsey 24 sierpień 2011, 01:20

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

0
citronas 28 wrzesień 2011, 01:00