GridView数据绑定问题

时间:2011-08-23 19:47:12

标签: asp.net data-binding gridview

在我的一张桌子中,我有三个以下字段:id,title,content

如果我将表数据数据绑定到GridView我希望使用displaycontent.aspx?id ='id'格式的标题链接。

我的问题是如果我没有在gridview中显示id字段,我没有将id字段绑定到它。如何在datarowbind事件中获取id值?

3 个答案:

答案 0 :(得分:2)

Juse创建一个模板字段,并将绑定的所有自定义本地化到控件的OnDataBinding事件。出于某些原因,大多数人都会在我不推荐的RowDataBound事件中这样做。没有理由必须使用控件DataBinding搜索控件,它还允许自定义本地化并易于更换而不必影响其他任何操作。想象一下,如果您的网格中有20个需要DataBinding某种自定义的控件。你的RowDataBound事件将是一团糟,并且必须知道网格中可能容易出错的所有内容。

示例:

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

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

我更喜欢这种方法来内联代码,因为它不会使你的标记与任何逻辑混乱。如果第二天您需要它为LinkButton,则可以轻松地将其换出,而不会触及与HyperLink无关的任何其他代码。

答案 1 :(得分:1)

我认为你可以这样做:

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

并且您不需要绑定Id列

我没有测试,但我确信这是个主意。

答案 2 :(得分:0)

有几种方法可以做到这一点。实际上,您无需为此订阅RowDataBound事件。

您需要一个TemplateField列,其中包含满足您需求的UserControl(HyperLinkLinkButton或其他任何内容)

我们假设您的TemplateColumn如下所示:

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

你可以在标记中使用数据绑定,正如Icarus建议的那样。 意味着您的HyperLink看起来像这样(未经测试):

<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