【发布时间】:2017-05-27 18:47:48
【问题描述】:
我有一个包含员工数据的 xml 文件。我的页面的设计是这样的,当用户输入他的 ID 时,gridview 会显示他的技能(如果已经存在),否则什么都不会显示并继续输入他的数据(新员工)。我想使用他的 ID 过滤记录员工的数据并显示在网格视图中。但是在使用我的代码时,它会抛出异常,指出“'System.Data.DataRow' 不包含名为'EmployeeID'的属性”。我已经用正确的值限制了模板。那么问题来了呢?
我的 xml 架构
-<SkillSet>
-<SkillSets>
<EmployeeID>1</EmployeeID>
<EmployeeName>abc</EmployeeName>
<PLName>xyz</PLName>
<SkillName1>Html</SkillName1>
<SkillType1>Programming</SkillType1>
<SkillProficiency1>Beginner</SkillProficiency1>
<Experience1>1</Experience1>
<Comments>Hello</Comments>
</SkillSets>
</SkillSet>
我的aspx页面源码:
<asp:GridView ID="grdxml" runat="server" AutoGenerateColumns="False" BackColor="White"
BorderColor="Black" BorderStyle="None" BorderWidth="1px" CellPadding="1" GridLines="Vertical"
OnSelectedIndexChanged="grdxml_SelectedIndexChanged"
onrowdeleting="grdxml_RowDeleting">
<AlternatingRowStyle BackColor="#DCDCDC" />
<Columns>
<asp:TemplateField HeaderText="ID">
<ItemTemplate>
<asp:Label ID="lblEmpId" runat="server" Text='<%# Bind("EmployeeID")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Name">
<ItemTemplate>
<asp:Label ID="lblEmpName" runat="server" Text='<%# Bind("EmployeeName")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="PL Name">
<ItemTemplate>
<asp:Label ID="lblPLName" runat="server" Text='<%# Bind("PLName")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Skill Name 1">
<ItemTemplate>
<asp:Label ID="lblSkillName1" runat="server" Text='<%# Bind("SkillName1")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Skill Type 1">
<ItemTemplate>
<asp:Label ID="lblSkillType1" runat="server" Text='<%# Bind("SkillType1")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Skill Proficiency 1">
<ItemTemplate>
<asp:Label ID="lblSkillProf1" runat="server" Text='<%# Bind("SkillProficiency1")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Experience">
<ItemTemplate>
<asp:Label ID="lblExp1" runat="server" Text='<%# Bind("Experience1")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Command"> <ItemTemplate>
<asp:LinkButton Text="Select" ID="lnkSelect" runat="server" CommandName="Select" />
<asp:LinkButton ID="lnkDelete" runat="server" CommandName="delete">Delete</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我用于绑定网格的 c# 代码:
private void BindGrid()
{
string filename = Server.MapPath("~/SkillSet.xml");
if (File.Exists(filename) == true)
{
try
{
string filePath = Server.MapPath("SkillSet.xml");
DataSet ds = new DataSet();
ds.ReadXml(filePath);
var skillSets = ds.Tables[0].AsEnumerable();
var query = from SkillSets in skillSets
where SkillSets.Field<string>("EmployeeID") == emplid
select SkillSets;
grdxml.DataSource = query.ToList();
grdxml.DataBind();
}
catch (Exception ex)
{
lblerror.Text = ex.ToString();
}
}
}
全栈跟踪:
System.Web.HttpException (0x80004005): DataBinding: 'System.Data.DataRow' does not contain a property with the name 'EmployeeID'. at System.Web.UI.DataBinder.GetPropertyValue(Object container, String propName) at System.Web.UI.DataBinder.Eval(Object container, String[] expressionParts) at System.Web.UI.DataBinder.Eval(Object container, String expression) at System.Web.UI.TemplateControl.Eval(String expression) at ASP.default_aspx.__DataBinding__control130(Object sender, EventArgs e) in c:\Users\SkillSet\Default.aspx:line 230 at System.Web.UI.Control.OnDataBinding(EventArgs e) at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System.Web.UI.Control.DataBindChildren() at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System.Web.UI.Control.DataBindChildren() at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) at System.Web.UI.Control.DataBind() at System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource) at System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) at System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) at System.Web.UI.WebControls.DataBoundControl.PerformSelect() at System.Web.UI.WebControls.BaseDataBoundControl.DataBind() at System.Web.UI.WebControls.GridView.DataBind() at _Default.BindGrid() in c:\Users\SkillSet\Default.aspx.cs:line 366
【问题讨论】:
-
什么是
emplid? -
emplid 是一个局部变量,用于存储员工输入其 ID 的文本框中的数据
-
@panman 你在
query得到什么? -
@AfnanAhmad 查询应该显示 EmployeeID 属性与用户输入的记录匹配的记录
标签: c# asp.net xml linq datagridview