【问题标题】:Filter a specific record from xml file to gridview asp.net将特定记录从 xml 文件过滤到 gridview asp.net
【发布时间】: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


【解决方案1】:

我刚刚测试了这个并且它工作正常:

var xmlStr = File.ReadAllText(Server.MapPath("YourFileName.xml"));
var str = XElement.Parse(xmlStr);
var result = str.Elements("SkillSets").Where(x => x.Element("EmployeeID").Value.Equals(emplid.ToString())).ToList();    
List<Employee> mapList = new List<Employee>();
foreach (var item in result)
{
    Employee obj = new Employee();
    obj.EmployeeID = item.Element("EmployeeID").Value;
    obj.EmployeeName = item.Element("EmployeeName").Value;
    obj.PLName = item.Element("PLName").Value;
    obj.SkillName1 = item.Element("SkillName1").Value;
    obj.SkillType1 = item.Element("SkillType1").Value;
    obj.SkillProficiency1 = item.Element("SkillProficiency1").Value;
    obj.Experience1 = item.Element("Experience1").Value;
    obj.Comments = item.Element("Comments").Value;
    mapList.Add(obj);
}

grdxml.DataSource = mapList;
grdxml.DataBind();

您可以创建Employee 的类:

public class Employee
    {
    private string _EmployeeID;
    public string EmployeeID
    {
        get
        {
            return _EmployeeID;
        }
        set
        {
            _EmployeeID = value;
        }

    }
    private string _EmployeeName;
    public string EmployeeName
    {
        get
        {
            return _EmployeeName;
        }
        set
        {
            _EmployeeName = value;
        }
    }
    private string _PLName;
    public string PLName
    {
        get
        {
            return _PLName;
        }
        set
        {
            _PLName = value;
        }
    }

    private string _SkillName1;
    public string SkillName1
    {
        get
        {
            return _SkillName1;
        }
        set
        {
            _SkillName1 = value;
        }
    }

    private string _SkillType1;
    public string SkillType1
    {
        get
        {
            return _SkillType1;
        }
        set
        {
            _SkillType1 = value;
        }
    }

    private string _SkillProficiency1;
    public string SkillProficiency1
    {
        get
        {
            return _SkillProficiency1;
        }
        set
        {
            _SkillProficiency1 = value;
        }
    }

    private string _Experience1;
    public string Experience1
    {
        get
        {
            return _Experience1;
        }
        set
        {
            _Experience1 = value;
        }
    }

    private string _Comments;
    public string Comments
    {
        get
        {
            return _Comments;
        }
        set
        {
            _Comments = value;
        }
    }
}

【讨论】:

  • 感谢您的回复。我会尝试实现它并更新结果:)
  • 我使用它并让它工作..非常感谢您的帮助先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2019-03-08
  • 2020-10-12
  • 1970-01-01
相关资源
最近更新 更多