外键在不同的对象中

时间:2011-07-15 23:00:36

标签: c# asp.net gridview

我有两个班级:

public class Equipment
{
    public int EquipmentId { get; set; }
    public string Name { get; set; }
    public Nullable<int> EquipmentTypeId { get; set; }
}

public class EquipmentType
{
    public int EquipmentTypeId { get; set; }
    public string TypeName { get; set; }
}

我将数据库中的设备列表作为List<Equipment>返回。

然后我通过Gridview1.DataSource = equipmentList将它绑定到Gridview 这很好,但我需要做的是我需要显示EquipmentType Name而不是ID。并且,在编辑模式下,我需要显示包含所有可用EQuipmentTypeNames的下拉列表。有关如何做到这一点的任何建议?什么是架构?

3 个答案:

答案 0 :(得分:1)

我建议您将Equipment课程扩展为子课程(暂时将其称为EquipmentEx),然后添加EquipmentTypeName属性。而不是只返回Equipment列的存储过程,请加入EquipmentType表,并包含其他类型名称列。

或者创建一个进行连接的视图,让你的存储过程返回视图内容而不是表格内容 - 这取决于你的应用程序的组织方式。

一旦你有一个EquipmentEx对象,那么你就得到了显示类型名称而不是ID的答案 - 它已经是对象的一部分了,所以你可以像平常一样显示它。

至于将下拉列表放入GridView,您可能正在使用模板字段中的EditItemTemplate标记,但我真的没有使用GridView来确切地知道它的外观。我总是更喜欢手动处理这种事情,而不是相信ASP.NET会为我做这件事。但是,由于您的下拉列表的值将代表EquipmentTypeID,因此您应该能够在保存时将此值绑定到对象,而不是TextBox值。

答案 1 :(得分:1)

要在GridView中显示,您有几个选项,从最简单到最难。

  1. 对设备类型使用嵌套的SqlDataSource,并在禁用的下拉列表中显示。
  2. 使用数据绑定设备加载设备类型。
  3. 以编程方式在RowDataBound事件中加载设备类型。
  4. 以下是如何包含设备类型数据的示例:

    var equips = GetEquipment();
    var equipTypes = GetEquipmentTypes();
    
    var data = from eq in equips
                join et in equipTypes on eq.EquipmentTypeId equals et.EquipmentTypeId
                select new { eq.EquipmentId, eq.Name, et.TypeName };
    
    GridView.DataSource = data;
    

    要在GridView中进行编辑,最简单的方法是将DropDownList与其自己的SqlDataSource(或自定义数据源)一起使用,该SqlDataSource绑定到Equipment.EquipmentTypeId,如下所示:

    <EditItemTemplate>
        <asp:DropDownList ID="EquipmentTypeDropDown" runat="server"
            SelectedValue='<%#Bind("EquipmentTypeId") %>'
            DataSource='<%#GetEquipmentTypes() %>'
            DataTextField="TypeName" DataValueField="EquipmentTypeId">
        </asp:DropDownList>
    </EditItemTemplate>
    

    其中GetEquipmentTypes()只是一个返回我用于数据绑定的List<EquipmentType>的方法。在这种情况下,由于我没有数据库,我只是在存根对象中生成数据。您将使用从数据库读取数据的BAL类(或ADO.Net代码或ObjectDataSource等)替换此方法。

    protected List<EquipmentType> GetEquipmentTypes()
    {
        return new List<EquipmentType> {
            new EquipmentType { EquipmentTypeId = 1, TypeName = "Baseball" },
            new EquipmentType { EquipmentTypeId = 2, TypeName = "Football" },
            new EquipmentType { EquipmentTypeId = 3, TypeName = "Soccer" },
        };
    }
    

答案 2 :(得分:0)

首先,如果你想像它那样绑定它,你需要创建自己的包含所有信息的类,如:

public class CompositeEquipment
{
    public int EquipmentId { get; set; }
    public string Name { get; set; }
    public string EquipmentTypeName { get; set; }
}

如果您使用的是sql语句或存储过程,则可以编写以下内容:

SELECT Equipment.EquipmentID,Equipment.Name,EquipmentType.TypeName FROM Equipment
INNER JOIN  EquipmentType ON Equipment.EquipmentTypeId = EquipmentType.EquipmentTypeId

当读取SqlDataReader时,请执行以下操作:

List<Equipment> lstEquipment = new List<Equipment>();
while(reader.read())
{
Equipment eq = new Equipment();
eq.reader["EquipmentId"];
eq.reader["Name"];
eq.reader["TypeName "];
lstEquipment.Add(eq);
}
Gridview1.DataSource = lstEquipment;

如果您使用EntityFramework作为数据访问层,您可以编写以下内容:

using(YourOwnContext context = new YourOwnContext)
{
List<Equipment> lstEquipment = (from e in context.Equipments
                               select new Equipment
                               {
                                  EquipmentId = e.EquipmentId,
                                  Name = e.Name,
                                  TypeName = e.EquipmentType.TypeName
                               }}).ToList();
Gridview1.DataSource = lstEquipment;

希望这会对你有所帮助。