GridView显示文本而不是外键

时间:2015-12-11 22:24:43

标签: c# asp.net linq gridview

我刚刚开始学习如何使用Gridview控件来显示SQL数据。除了为查询表中填充的某个数据字段显示更加用户友好的信息外,我几乎可以完成所有工作。我希望能够更新,插入和删除新记录的页面的整个概念,由于某些原因,当我使用SqlDataSource时,我无法使这些选项工作,所以我使用LinqDataSource,所有现在都在工作(除了我还没想出插入......一个单独的问题)

我还使用Visual Studio中的控件选项卡来选择和编辑控件的属性,以便使用向导而不是手动编写示例。

我无法弄清楚如何使用employeesetypeid创建包含employeetypelookup表中的外键的栏目,以显示用户的employeetype文本值,这样更有意义。我发现了一个“演练:在GridView Web服务器控件中编辑时显示下拉列表”,这非常有效。当我进入编辑模式时,下拉列表显示了employeesetype文本,当我选择其他类型时,相应的employeesetype id将存储在数据库中。

那么如何修改某些内容(数据源???)以在DataGrid中显示employeesetype文本。

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

提前感谢。

1 个答案:

答案 0 :(得分:0)

好的,如果我理解你应该做的是在函数中传递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相似,这是非常糟糕的做法。