GridView显示文本而不是外键
本文关键字:显示 文本 GridView | 更新日期: 2023-09-27 18:26:38
我刚刚开始学习如何使用Gridview控件来显示SQL数据。除了为我从查找表中填充的一个数据字段显示更用户友好的信息外,我几乎可以让所有事情都正常工作。页面的整个概念我也希望能够更新、插入和删除新记录,由于某种原因,我在使用SqlDataSource时无法使用这些选项,所以我使用了LinqDataSource,现在一切都正常了(除了我还没有弄清楚插入……另一个问题)
我还使用Visual Studio中的控件选项卡来选择和编辑控件的属性,这有点像使用向导,而不是手工编写示例。
我无法理解的是,如何使用employeetypeid创建我的列,该列包含employeetypelookup表中的外键,以向用户显示employeetype文本值,这样做更有意义。我发现了一个"演练:在GridView Web服务器控件中编辑时显示下拉列表",这非常有效。当我进入编辑模式时,下拉列表会显示employeetype文本,当我选择不同的类型时,相应的employentype id会存储在数据库中。
那么,我如何修改某些内容(数据源??)以在数据网格中显示employeetype文本。
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="SNRmain.SNRmainDataContext" EntityTypeName="" OrderBy="lastname, preferredfirstname" Select="new (personnelid, lastfirstname)" TableName="masterpersonnellastpreferreds"></asp:LinqDataSource>
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" DataSourceID="LinqDataSource1" DataTextField="lastfirstname" DataValueField="personnelid">
</asp:DropDownList>
<asp:LinqDataSource ID="LinqDataSource2" runat="server" ContextTypeName="SNRmain.SNRmainDataContext" EnableDelete="True" EnableInsert="True" EnableUpdate="True" EntityTypeName="" TableName="tblappointmentdates" Where="personnelid == @personnelid" OrderBy="startdate desc">
<WhereParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="personnelid" PropertyName="SelectedValue" Type="Int32" />
</WhereParameters>
</asp:LinqDataSource>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataKeyNames="snrappointmentid" DataSourceID="LinqDataSource2">
<Columns>
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True" />
<asp:BoundField DataField="startdate" HeaderText="startdate" SortExpression="startdate" />
<asp:BoundField DataField="endingdate" HeaderText="endingdate" SortExpression="endingdate" />
<asp:TemplateField HeaderText="employeetypeid" SortExpression="employeetypeid">
<EditItemTemplate>
<asp:DropDownList ID="DropDownList2" runat="server" DataSourceID="LinqDataSource3" DataTextField="employeetypetext" DataValueField="employeetypeid" SelectedValue='<%# Bind("employeetypeid", "{0}") %>'>
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("employeetypeid") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="apptcomment" HeaderText="apptcomment" SortExpression="apptcomment" />
<asp:BoundField DataField="dateentered" HeaderText="dateentered" SortExpression="dateentered" />
</Columns>
</asp:GridView>
<asp:LinqDataSource ID="LinqDataSource3" runat="server" ContextTypeName="SNRmain.SNRmainDataContext" EntityTypeName="" OrderBy="employeetypetext" Select="new (employeetypeid, employeetypetext)" TableName="tblemployeetypelookups">
</asp:LinqDataSource>
我试图修改LinqDataSource2以包含如下语句,但该语句不起作用,并且我收到了一个对我来说没有意义的错误。"System.Web.Query.Dynameic.ParseException:语法错误.
<asp:LinqDataSource ID="LinqDataSource2" runat="server" ContextTypeName="SNRmain.SNRmainDataContext" EntityTypeName="" Select="snrappointmentid,
personnelid, startdate,
endingdate, employeetypeid,
tblemployeetypelookup.employeetypetext
from tblappointmentdates
join tblemployeetypelookups on tblappointmentdates.employeetypeid = tblemployeetypelookups.employeetypeid" TableName="tblappointmentdates" Where="personnelid == @personnelid">
<WhereParameters>
<asp:ControlParameter ControlID="DropDownList1" Name="personnelid" PropertyName="SelectedValue" Type="Int32" />
</WhereParameters>
</asp:LinqDataSource>
提前谢谢。
好的,如果我理解正确的话,你应该做的是在函数中传递employeetypeid
,检索文本并将其绑定到这样的控件。
来自
<asp:Label ID="Label1" runat="server" Text='<%# Bind("employeetypeid") %>'></asp:Label>
至
<asp:Label ID="Label1" runat="server" Text='<% #GetEmployeeName(Eval("employeetypeid"))%>' runat="server" />
所以现在GetEmployeeName
是一个服务器函数,您可以编写它来从id中获取名称。
protected string GetEmployeeName(int employeetypeid)
{
//What ever is the way to query and return from here
}
另外,我注意到你像Label1一样命名,这是一种非常糟糕的做法。