【问题标题】:Complex Data Binding in GridView controlGridView 控件中的复杂数据绑定
【发布时间】:2015-01-29 10:17:19
【问题描述】:

我有几个使用主键关联在一起的表。当我想使用 GridView 和数据绑定显示表格时。 GridView 显示了对我没用的相关表的主键!我希望显示相关表的另一列(但我仍然希望能够使用相关表的行的 ID 进行编辑)。

<asp:GridView ID="GridView1" runat="server" 
     OnSelectedIndexChanged="GridView1_SelectedIndexChanged" 
     AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" 
     DataKeyNames="Id" DataSourceID="FaiulerDataSource">
    <Columns>
        <asp:CommandField ShowSelectButton="True" />
        <asp:BoundField DataField="Id" HeaderText="Id" InsertVisible="False" ReadOnly="True" SortExpression="Id" />
        <asp:BoundField DataField="Date" HeaderText="Date" SortExpression="Date" />
        <asp:BoundField DataField="FaiulerDiscription" HeaderText="FaiulerDiscription" SortExpression="FaiulerDiscription" />
        <asp:BoundField DataField="ShiftMaster" HeaderText="ShiftMaster" SortExpression="ShiftMaster" />
        <asp:CheckBoxField DataField="Approval" HeaderText="Approval" SortExpression="Approval" />
        <asp:BoundField DataField="RepairManId" HeaderText="RepairManId" SortExpression="RepairManId" />
        <asp:BoundField DataField="OperatorId" HeaderText="OperatorId" SortExpression="OperatorId" />
        <asp:BoundField DataField="Part_Id" HeaderText="Part_Id" SortExpression="Part_Id" />
        <asp:BoundField DataField="Shift_Id" HeaderText="Shift_Id" SortExpression="Shift_Id" />
        <asp:BoundField DataField="FaultType_Id" HeaderText="FaultType_Id" SortExpression="FaultType_Id" />
        <asp:BoundField DataField="Machine_Id" HeaderText="Machine_Id" SortExpression="Machine_Id" />
        <asp:BoundField DataField="RepairType_Id" HeaderText="RepairType_Id" SortExpression="RepairType_Id" />
    </Columns>
</asp:GridView>

如您所见,Faiuler 表包含许多列。我还有其他名为RepairManMachinesShift 等的表,因此此代码显示repairman_id,但我希望向用户显示RepairMan_Name,但我仍然需要RepairMan_id 进行编辑和删除东西。

更新:

这是 DataSource 的代码,可以告诉您如何更改它吗?我不太了解我使用向导创建数据源而不是编写代码。

 <asp:SqlDataSource ID="FaiulerDataSource" runat="server" 
      ConnectionString="<%$ ConnectionStrings:WoodFactoryConnectionString %>" 
      SelectCommand="SELECT [Id], [Date], [FaiulerDiscription], [ShiftMaster], [Approval], [RepairManId], [OperatorId], [Part_Id], [Shift_Id], [FaultType_Id], [Machine_Id], [RepairType_Id] FROM [Failures] WHERE ([RepairManId] IS NULL)">
</asp:SqlDataSource>

【问题讨论】:

  • 您可以将 `id' 绑定到标签并隐藏它,因此当您要删除或编辑时,您可以找到该标签。
  • 没关系,但这并不能解决主要问题!我想显示 repairMan 的“名称”属性,而不是他的 ID,它不在故障表中,而是在 RepairMan 表中
  • 好的,那么它们之间是否存在关系,如果是,您应该更改select 查询并加入该表,然后将其绑定到Name
  • 我不知道该怎么做!看看更新!这是我的第一个 ASP.Net 项目!而且我以前从未与 DB 合作过!
  • 如果RepairMan 是单独的表,您应该更改FaiulerDataSource 选择查询。

标签: asp.net data-binding


【解决方案1】:

您应该在选择命令中选择该字段,例如:

<asp:SqlDataSource ID="FaiulerDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:WoodFactoryConnectionString %>" SelectCommand="SELECT [Id], [Date], [FaiulerDiscription], [ShiftMaster], [Approval], [RepairManId], [OperatorId], [Part_Id], [Shift_Id], [FaultType_Id], [Machine_Id], [RepairType_Id],RepairMan.RepairMan_Name FROM [Failures],[RepairMan] WHERE (Failures.RepairManId IS NULL)"></asp:SqlDataSource>

如果它们之间存在关系,我想RepairManFailures 表之间存在one-to-many 关系,这意味着一个RepairMan 可以有多个Failures,所以你应该加入这两个并更改选择命令如下:

SELECT Failures.Id, Failures.Date, Failures.FaiulerDiscription, Failures.ShiftMaster, Failures.Approval,
 Failures.RepairManId,Failures.OperatorId, Failures.Part_Id, Failures.Shift_Id, Failures.FaultType_Id, Failures.Machine_Id, Failures.RepairType_Id,RepairMan.RepairMan_Name,RepairMan.FauilarId
 FROM [Failures] inner join RepairMan on RepairMan.RepairMan_Id = Failures.RepairManId WHERE (Failures.RepairManId IS NULL)

然后你可以像这样绑定名称:

 <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" />

【讨论】:

  • 是的!那就是每个修理工可以有很多故障,每个故障只能有一个修理工
  • 是的,我正在改变它! RepairMen 表有 id 和 Name 我应该写 RepairMen.RepairMen_Id 还是只写 RepairMen.id ?另一个问题是 [] neccesery 吗?
  • 是的,如果这是RepairMan 中的主键,你应该写,如果RepairMan 中没有IdFailures 表中的外键,你应该写RepairMan.Id = Failures.RepairManId
  • Aboute [], SqlDataSource 自动生成它,因为您可以在表格中使用内置关键字,例如 Type,我认为如果它被 [] 包围,那么它可以理解它不是关键字,或者您可以使用方括号将名称括起来。如果名称不包含任何空格或特殊字符(如标点符号),则方括号是可选的。如果名称确实包含空格或特殊字符,则必须使用方括号。
  • 我已经测试了所有可能的方法。我仍然得到“','附近的语法错误”。我想我应该干脆忘记它。
【解决方案2】:

假设您已经将名称包含在数据源中,您可以使用以下方法绑定到名称

<asp:BoundField DataField="RepairMan_Name" HeaderText="repair name"  />

你的 sqldatasource 应该如下所示

SELECT [Id], [Date], [FaiulerDiscription], [ShiftMaster], [Approval], [RepairManId], [OperatorId], [Part_Id], [Shift_Id], [FaultType_Id], [Machine_Id], [RepairType_Id], [RepairMan.RepairMan_Name] AS RepairMan_Name FROM [Failures] inner join RepairMan on RepairMan.repairmanid = failures.repairmanid WHERE ([RepairManId] IS NULL)

【讨论】:

  • 它们不在数据源中,因为它们 RepairMan 是一个单独的表。
  • 所以只需更新sqldatasource的select命令,将列名包含在选择列表中
  • 我不知道该怎么做!能告诉我怎么做吗?我已经在更新中添加了数据源代码!
  • 我在 ',' 附近遇到了不正确的语法错误,这表明 '[RepairType_Id],RepairMan.RepairMan_Name FROM' 这部分有问题。
  • 现在将检查答案,请确认选择命令在 sql 管理工作室内正常工作
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多