我有一个连接到SQL数据源的GridView,我希望将其显示为主队和客队名称。相反,我只能检索他们的Home_Team_ID
和Away_Team_ID
,因为这些匹配他们Team_ID that is stored in another table. I've tried "Bind("Team_name")" but this returns the first team name in the
Team`表的双方。我该如何解决?
<asp:GridView ID="EnterMatchGridView" runat="server" AutoGenerateColumns="False" DataKeyNames="Team_ID" DataSourceID="SqlDataSource2" OnRowDataBound="EnterMatchGridView_RowDataBound">
<Columns>
<asp:TemplateField HeaderText="Home_team_ID" SortExpression="Home_team_ID">
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("Home_team_ID") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("Home_team_ID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Away_team_ID" SortExpression="Away_team_ID">
<EditItemTemplate>
<asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("Away_team_ID") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("Away_team_ID") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="Home_team_score" HeaderText="Home_team_score" SortExpression="Home_team_score" />
<asp:BoundField DataField="Away_team_score" HeaderText="Away_team_score" SortExpression="Away_team_score" />
<asp:TemplateField HeaderText="Game_date" SortExpression="Game_date">
<EditItemTemplate>
<asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Game_date") %>'></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Game_date") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="SqlDataSource2" runat="server" ConnectionString="<%$ ConnectionStrings:SportsData2ConnectionString %>" SelectCommand="SELECT MatchStatistics.Home_team_ID, MatchStatistics.Away_team_ID, MatchStatistics.Home_team_score, MatchStatistics.Away_team_score, MatchStatistics.Game_date, Team.Team_ID, Team.Team_name FROM MatchStatistics INNER JOIN Team ON (MatchStatistics.Home_team_ID = Team.Team_ID OR MatchStatistics.Away_team_ID = Team.Team_ID) AND MatchStatistics.Home_team_ID = Team.Team_ID WHERE (Team.Team_ID = @Team_ID)">
<SelectParameters>
<asp:ControlParameter ControlID="HomeFormDDL" Name="Team_ID" PropertyName="SelectedValue" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
每个主队和客队的专栏都说出他们的ID(在这种情况下是8和32),我想用相应的Team_IDs
代替这些。阿斯顿维拉和诺维奇分别有Team_ID
8和32。
答案 0 :(得分:0)
我相信你会想要设置列的HeaderText
。
foreach(var col in EnterMatchGridView.Columns)
{
col.HeaderText = "Some Text";
}
当然,上面的示例并不完全符合您的要求,但它确实显示了如何访问它。如果您在ASP代码中查看上方,如果您不需要通过代码进行设置,则会看到<asp:TemplateField HeaderText="Away_team_ID" ...>
您可以在其中进行修改。
如果您愿意,也可以将某些内容绑定到该属性。
在澄清之后,您应该确保您的SQL查询正确地选择数据。我不知道你的表格结构我只能猜测,但你可能想要这样的东西:
select t1.home_team_id, t2.team_name as home_team_name,
t1.away_team_id, t3.team_name as away_team_name,
t1.home_team_score, t1.away_team_score, t1.game_date
from game_table t1
join team_table t2
on t2.team_id = t1.home_team_id
join team_table t3
on t3.team_id = t1.away_team_id;
然后,您可以绑定列上的home_team_name
和away_team_name
。
使用DataTables,如上所述,您应该能够执行以下操作,然后绑定到results
作为数据表:
DataTable games = new DataTable()
games.Columns.Add("Home_Team_ID", typeof(int));
games.Columns.Add("Home_Team_Name", typeof(string));
games.Columns.Add("Away_Team_ID", typeof(int));
games.Columns.Add("Away_Team_Name", typeof(string));
games.Columns.Add("Home_Team_Score", typeof(int));
games.Columns.Add("Away_Team_Score", typeof(int));
games.Columns.Add("Game_Date", typeof(DateTime));
var results = from dataRows1 in MatchStatistics.AsEnumerable()
join dataRows2 in Teams.AsEnumerable()
on dataRows1.Field<int>("Home_Team_ID") equals dataRows2.Field<int>("Team_ID")
join dataRows3 in Teams.AsEnumerable()
on dataRows1.Field<int>("Away_Team_ID") equals dataRows3.Field<int("Team_ID")
select games.LoadDataRow(new object[]
{
dataRows1.Field<int>("Home_Team_ID"),
dataRows2.Field<string>("Team_Name"),
dataRows1.Field<int>("Away_Team_ID"),
dataRows3.Field<string>("Team_Name"),
dataRows1.Field<int>("Home_Team_Score"),
dataRows1.Field<int>("Away_Team_Score"),
dataRows1.Field<DateTime>("Game_Date")
}, false);
最终,归结为您需要使用关系访问Teams
DataTable,除非您按{{1}过滤结果,否则您无法自行访问该表,否则你只需要获取DataTable中的第一个项目或所有项目。