在 ASP.NET C# Web 应用程序中使用 ADO.NET 和 XML
Use ADO.NET and XML in ASP.NET C# Web applications
我是 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>
将 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)
{
string 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 更改为 repeoater 或数据列表。
让我们使用数据列表。
所以,我们的标记现在变成了:
<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();
}
现在的结果是这样的:
因此,将结果发送到网格或只是一些代码实际上是完全相同的过程。事实上,如您所见,我们将网格视图换成了详细信息视图。换句话说,只是更改了 2 行代码,我们用详细信息视图代替了网格视图。
但是,如前所述,您显然希望以任何您想要的方式布置最终结果 - 不需要网格,甚至不需要内置详细信息视图。
正如您在上一个示例中看到的那样 - grab/get 将过滤器的结果放入一个漂亮的简单 DataRow 对象中是一件简单的事情,从中我们只需编写我们删除的控件的设置在页面上。我的示例布局当然可以是您能够想到的任何一种布局。
我是 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>
将 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) { string 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 更改为 repeoater 或数据列表。
让我们使用数据列表。
所以,我们的标记现在变成了:
<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();
}
现在的结果是这样的:
因此,将结果发送到网格或只是一些代码实际上是完全相同的过程。事实上,如您所见,我们将网格视图换成了详细信息视图。换句话说,只是更改了 2 行代码,我们用详细信息视图代替了网格视图。
但是,如前所述,您显然希望以任何您想要的方式布置最终结果 - 不需要网格,甚至不需要内置详细信息视图。
正如您在上一个示例中看到的那样 - grab/get 将过滤器的结果放入一个漂亮的简单 DataRow 对象中是一件简单的事情,从中我们只需编写我们删除的控件的设置在页面上。我的示例布局当然可以是您能够想到的任何一种布局。