我有两个班级:
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的下拉列表。有关如何做到这一点的任何建议?什么是架构?
答案 0 :(得分:1)
我建议您将Equipment
课程扩展为子课程(暂时将其称为EquipmentEx
),然后添加EquipmentTypeName
属性。而不是只返回Equipment
列的存储过程,请加入EquipmentType
表,并包含其他类型名称列。
或者创建一个进行连接的视图,让你的存储过程返回视图内容而不是表格内容 - 这取决于你的应用程序的组织方式。
一旦你有一个EquipmentEx
对象,那么你就得到了显示类型名称而不是ID的答案 - 它已经是对象的一部分了,所以你可以像平常一样显示它。
至于将下拉列表放入GridView,您可能正在使用模板字段中的EditItemTemplate标记,但我真的没有使用GridView来确切地知道它的外观。我总是更喜欢手动处理这种事情,而不是相信ASP.NET会为我做这件事。但是,由于您的下拉列表的值将代表EquipmentTypeID,因此您应该能够在保存时将此值绑定到对象,而不是TextBox值。
答案 1 :(得分:1)
要在GridView中显示,您有几个选项,从最简单到最难。
以下是如何包含设备类型数据的示例:
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;
希望这会对你有所帮助。