在 ASP.NET C# Web 应用程序中使用 ADO.NET 和 XML

Posted

技术标签:

【中文标题】在 ASP.NET C# Web 应用程序中使用 ADO.NET 和 XML【英文标题】:Use ADO.NET and XML in ASP.NET C# Web applications 【发布时间】:2022-01-04 12:52:15 【问题描述】:

我是 ASP.NET 网络表单和 C# 的新手。我想创建一个简单的 Web 应用程序,它具有从 XML 文档中搜索特定学生姓名的功能。该网络应用程序有一个文本框,我可以在其中输入学生姓名或 ID,然后单击提交按钮,它应该从 XML 中检索学生的数据。我如何使这个搜索功能从 XML 中工作?用户收到的数据应该是独立的,而不是 gridview 格式,所以我可以将它们设置为看起来像毕业证书。

这是我制作的示例: SampleStudentGraduation

这就是我想让它看起来像这样的方式: Sample

这是 XML 文档

<Graduate>

<Student>
<ID> 01944422</ID>
<Student_Name>Peter Parker</Student_Name>
<Honours> First Class </Honours>
<Book_Price>Yes</Book_Price>
<Programme>Comp. Science</Programme>
</Student>

<Student>
<ID>01923455</ID>
<Student_Name>Bryan Adam</Student_Name>
<Honours>Second class</Honours>
<Book_Price>No</Book_Price>
<Programme>Mathematics</Programme>
</Student>

<Student>
<ID>01952345</ID>
<Student_Name>Maggie Fong</Student_Name>
<Honours>First class</Honours>
<Book_Price>Yes</Book_Price>
<Programme>Accounting</Programme>
</Student>

<Student>
<ID>01998745</ID>
<Student_Name>Melissa Teh</Student_Name>
<Honours>First class</Honours>
<Book_Price>Yes</Book_Price>
<Programme>Finance</Programme>
</Student>


<Student>
<ID>01899888</ID>
<Student_Name>Ahmad bin Suhail</Student_Name>
<Honours>Second class</Honours>
<Book_Price>No</Book_Price>
<Programme>Engineering</Programme>
</Student>

<Student>
<ID>01900847</ID>
<Student_Name>Lechumanan a/l Vicky</Student_Name>
<Honours>Third class</Honours>
<Book_Price>No</Book_Price>
<Programme>Comp. Science</Programme>
</Student>

<Student>
<ID>04503967</ID>
<Student_Name>Soo Tong Wei</Student_Name>
<Honours>Third class</Honours>
<Book_Price>No</Book_Price>
<Programme>Mathematics</Programme>
</Student>

</Graduate>

【问题讨论】:

在继续之前,您是否知道 WebForms 不再是您用于新项目的技术?如果您要学习一些东西,请选择现代框架。 是的,我知道这一点,我只是想从 C# 中学习一些东西。有没有你推荐的现代框架 好的,很公平。您可以选择是否要使用XmlDataSource 或只是阅读 xml 并搜索您的记录。您的选择,但如果您不打算允许对数据进行编辑,那么您将通过做一些LINQ to XML 来了解更多 C# 非常感谢。我认为我会选择 LINQ to XML。 【参考方案1】:

将 xml 转换为数据集,然后一切都变成了公园散步。

所以,这个标记:

<div>
    <h1>Student Graduation</h1>
        Search for 
        <asp:TextBox ID="SearchTextBox" runat="server" />
        <asp:Button ID="SearchButton" Text="Search!" runat="server" OnClick="SearchButton_Click" 
            CssClass="btn" style="margin-left:15px"       />

    <br />
    <asp:GridView ID="GridView1" runat="server" CssClass="table" Width="40%">
    </asp:GridView>
</div>

以及搜索按钮的代码:

protected void SearchButton_Click(object sender, EventArgs e) 字符串 sFile = @"C:\Test7\sData.txt"; 数据集 MyData = new DataSet(); MyData.ReadXml(sFile);

    // if blank, then show all data
    DataTable MyTable = MyData.Tables[0];
    if (SearchTextBox.Text != "")
    
        string s = SearchTextBox.Text;
        // user entered somthing
        // if text, then match on stuent name

        if (s.All(char.IsNumber))
        
            // number, lets filter by ID
            MyTable.DefaultView.RowFilter = "ID = " + s;
        
        else
        
            // search Student name - partial match
            MyTable.DefaultView.RowFilter = "Student_Name like '%" + s + "%'";
        
    

    GridView1.DataSource = MyTable;
    GridView1.DataBind();

所以,如果我们什么都不输入,那么我们将全部显示并看到:

我使用通配符搜索名称 - 我想我们可以在开头匹配,但你可以说搜索“B”,然后你会得到:

当然,如果你输入一个数字,那么我通过ID搜索,然后说这个

我想我们应该在 GV 中添加一个“无数据行,这样说:

    <asp:GridView ID="GridView1" runat="server" CssClass="table" Width="40%">
        <EmptyDataTemplate>
            <h2>No data found</h2>
        </EmptyDataTemplate>
    </asp:GridView>

但是,如前所述,您不想要网格格式的结果。

因此,我们可以将 GV 更改为中继器或数据列表。

让我们使用数据列表。

所以,我们的标记现在变成了:

        <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="125px" >
        </asp:DetailsView>

代码和以前一样,执行这个:

        DetailsView1.DataSource = MyTable;
        DetailsView1.DataBind();

现在我们得到了 FORM 类型的布局结果:

因此,无论是网格,还是只是在页面上填写控件,方法都大同小异。当然没有限制,也没有理由为结果使用网格。

您甚至不必使用自动绑定控件(比如列表详细信息列表)。

您可以简单地放入控件,然后随意布置它们。

这样说:

         <div style="border-style:solid;color:black;width:300px;float:left">
            <div style="padding:5px;text-align:right">
                <p>Student ID: <asp:TextBox ID="ID" runat="server"               /></p>
                <p>Student Name: <asp:TextBox ID="Student_Name" runat="server"   /></p>
                <p>Honours: <asp:TextBox ID="Honours" runat="server"             /></p>
                <p>Book Price: <asp:TextBox ID="Book_Price" runat="server"       /></p>
                <p>Program: <asp:TextBox ID="Programme" runat="server"           /></p>
            </div>
        </div>

所以上面只是放入页面的简单控件。

现在我们要在上面填写的代码是:

(和以前一样,但现在代替网格绑定或数据列表绑定,我们只需使用代码来填充控件,如下所示:

     if (MyTable.DefaultView.Count > 0)
        
            // we have a match - display it
            DataRow OneRow = MyTable.DefaultView.ToTable().Rows[0]; 

            ID.Text = OneRow["ID"].ToString();
            Student_Name.Text = OneRow["STudent_Name"].ToString();
            Honours.Text = OneRow["Honours"].ToString();
            Book_Price.Text = OneRow["Book_Price"].ToString();
            Programme.Text = OneRow["Programme"].ToString();
        

结果现在是这样的:

因此,将结果发送到网格,或者只是一些代码实际上是相同的过程。事实上,如您所见,我们将 Grid 视图换成了 Details 视图。换句话说,只需更改 2 行代码,我们就有了一个详细信息视图来代替网格视图。

但是,如前所述,您显然希望以任何您想要的方式布置最终结果 - 并且不需要网格,甚至不需要内置详细信息视图。

正如您在上一个示例中看到的 - 将过滤器的结果抓取/获取到一个漂亮的简单 DataRow 对象中是一件简单的事情,然后我们只需编写我们拖放到页面上的控件的设置。我所拥有的示例布局当然可以是您能想到的任何类型的布局。

【讨论】:

以上是关于在 ASP.NET C# Web 应用程序中使用 ADO.NET 和 XML的主要内容,如果未能解决你的问题,请参考以下文章

如果未使用 C# 登录 ASP.NET Web 表单,则将用户重定向到登录

C#、Asp.Net Web 应用程序中出现奇怪的 System.***Exception 错误

如何在 Web 应用程序(ASP.Net、C#、IIS)中进行文件上传

ASP.NET Web 应用程序消息框

我们可以在 asp.net c# web 应用程序中嵌入对 twitter、linkedin、facebook、buzz 的授权吗?

使用 c# --> asp.net web api 在 json 中获取分层输出