如何在GridView中获取一个列以显示与其ID对应的名称?

时间:2016-05-07 20:58:25

标签: c# asp.net gridview

enter image description here

我有一个连接到SQL数据源的GridView,我希望将其显示为主队和客队名称。相反,我只能检索他们的Home_Team_IDAway_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`表的双方。我该如何解决? enter image description here

<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。

1 个答案:

答案 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_nameaway_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中的第一个项目或所有项目。