2013-05-08 260 views
0

我想知道是否有办法使用datakeynames访问不同表的主键,如果这些主键名称在这些表中不同。具有不同主键名称的不同表的DataKey名称

例如,我有一个名为Table1和Table2的表,其中主键分别是Table1ID和Table2ID。

我的最终目标是将两个表的内容组合成1个gridview,并为每一行生成一个超链接。所以,我的C#看起来是这样的:

protected void Page_Load(object sender, EventArgs e) 
{ 
    SqlCommand command = new SqlCommand("(SELECT Table1ID, Title FROM Table1" + 
              "UNION ALL SELECT Table2ID, Title FROM Table2)", connection); 

GridView1.DataBind(); 
} 

然后在我的Gridview_Databound方法,我经过和单独设置每行的超链接。问题是我如何访问Table1ID和Table2ID?在我的.aspx代码中,我可以将它设置为BoundField,因为DataField不会一致吗?我不能只做下面的事情,因为它忽略了Table2ID的权利?

<asp:BoundField DataField="Table1ID"/> 

也许我需要使用templateField或东西吗?

回答

1

您可以使用模板列如下代码

<asp:TemplateField HeaderText="Action"> 
<ItemTemplate> 
    <asp:LinkButton runat="server" ID="lnkEdit" ToolTip="Click to edit" CommandName="EditContent" CommandArgument='<%# Eval("Table1ID") %>' />  
</ItemTemplate> 
</asp:TemplateField> 

现在您OnRowCommand =“GridView1_RowCommand”,你会得到这个表的峰ID。

+0

我发现它只是在做Eva(“Table1ID”)。那么这将如何得到表2的pk? – Kevin 2013-05-08 21:44:48

+0

更改您的查询如下 SELECT Table1ID,Title FROM Table1 UNION ALL SELECT Table2ID AS Table1ID,Title FROM Table2 – 2013-05-09 08:32:43

+0

太棒了!我没有使用templatefield,但知道我可以做SELECT Table2ID AS Table1ID真的有帮助! – Kevin 2013-05-14 22:15:12

0

GridView控制中,您可以有一个TemplateField包含Hyperlink(有关此解决方案的详细信息,请参阅我的文章link)。

另外,如果您使用SqlDataSource将您的select语句分配给它的属性并将它传递给GridView.DataSource属性,那么可能会花费更少的人力。它只需要几行代码并为你完成这项工作。问候,AB

+0

嗯,不确定在这种情况下如何使用GridView.DataSource。另外,我应该补充一点,我在这个gridview上进行分页,所以我把所有东西都放到了DataTable中,然后我做了DataBind() – Kevin 2013-05-08 21:45:47