GridView вопрос привязки данных - PullRequest
0 голосов
/ 23 августа 2011

В одной из моих таблиц у меня есть три следующих поля: id, title, content

Если я привязываю данные таблицы к GridView, я хочу получить ссылку на заголовок в формате displaycontent.aspx? Id = 'id'.

У меня вопрос, если я не показываю поле id в виде сетки, которое я не привязываю к нему поле id. Как я могу получить значение id в событии datarowbind?

Ответы [ 3 ]

2 голосов
/ 24 августа 2011

Juse создает поле шаблона и локализует всю настройку привязки к событию OnDataBinding элемента управления. По какой-то причине большинство людей делают это на мероприятии RowDataBound, которое я не рекомендую. Нет необходимости искать элементы управления с помощью привязки данных DataBinding, а также позволяет локализовать настройки и легко заменять их, не затрагивая ничего другого. Представьте, что у вас в сетке 20 элементов управления, требующих DataBinding настроек. Ваше RowDataBound событие будет беспорядочным, и вам придется знать обо всем в сетке, которая может легко глючить.

Пример:

<asp:TemplateField>
    <ItemTemplate>
        <asp:HyperLink runat="server" ID="lnkYourLink"
            OnDataBinding="lnkYourLink_DataBinding" />
    </ItemTemplate>
</asp:TemplateField> 

В кодовой привязке:

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())
}     

Я также предпочитаю этот метод встроенному коду, так как он не загромождает вашу разметку какой-либо логикой. Если на следующий день вам понадобится LinkButton, вы можете легко поменять его, не касаясь другого кода, не связанного с HyperLink.

1 голос
/ 23 августа 2011

Я думаю, вы можете сделать что-то вроде:

NavigationUrl='displaycontent.aspx?id=<%#Eval("Id")%>' 

И вам не нужно связывать столбец Id

Я не проверял, но я уверен, что это идея.

0 голосов
/ 24 августа 2011

Есть несколько способов сделать это.Вам на самом деле не нужно подписываться на RowDataBound событие для этого.

Вам нужен столбец TemplateField, который содержит UserControl, который удовлетворяет вашим потребностям (HyperLink, LinkButton или любой другой)

Давайте предположим, что ваш TemplateColumn выглядит так:

<asp:TemplateField>
    <ItemTemplate>
        <asp:HyperLink runat="server" ID="hlContent" Text="Details" />
    </ItemTemplate>
</asp:TemplateField>

В разметке вы можете иметь привязку данных, как предложил Icarus.Означает, что ваша гиперссылка будет выглядеть так (не проверено):

<asp:HyperLink runat="server" ID="hlContent" Text="Details" />

Другой вариант - использовать событие RowDataBound, как вы задали его в своем вопросе:

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

Редактировать : После публикации нескольких ответов о том, как использовать событие RowDataBound, я решил написать статью с его описанием: http://www.tomot.de/en-us/article/7/asp.net/gridview-overview-of-different-ways-to-bind-data-to-columns

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...