将我的 .aspx 页面中的代码转换为 C# .cs 页面中的代码
Converting code from my .aspx page to code behind in the C# .cs page
通过 Visual Studio 学习如何在 ASP.NET 中编码有其优点和缺点。优点是一切都可以通过拖放轻松完成,但缺点是我对背后的代码和所有这些 "data binding" 了解不多。我的 .aspx 页面中有这段代码,但我不确定如何将它 "convert" 到后面的代码中。例如,我现在正在尝试实现一个应用程序,该应用程序本质上是一个可搜索的应用程序(具有一个下拉列表,可作为要搜索的列的过滤器)具有具有读写功能的分页的 Gridview。这是我目前在 .aspx 页面中的代码:
<head runat="server">
<title></title>
<style>
.hiddencol
{
display: none;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="SearchBox" runat="server"></asp:TextBox>
<asp:DropDownList ID="SearchParameterList" runat="server">
<asp:ListItem Selected="True" Value="Project_Name">Project Name</asp:ListItem>
<asp:ListItem Value="Product">Product</asp:ListItem>
<asp:ListItem Value="Description">Description</asp:ListItem>
</asp:DropDownList>
<asp:Button ID="SearchButton" runat="server" Text="Search" OnClick="SearchButton_Click" />
<asp:Button ID="ClearButton" runat="server" OnClick="ClearButton_Click" Text="Clear" />
<br />
<br />
<asp:GridView ID="ProjectTable" runat="server" Font-Names="Verdana,Arial" Font-Size="12px" AutoGenerateColumns="False" AutoGenerateEditButton="True" DataSourceID="PopulateProjectTable" AllowPaging="True" OnPageIndexChanging="ProjectTable_PageIndexChanging>
<AlternatingRowStyle BackColor="#BFE4FF" />
<PagerStyle BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
<HeaderStyle Height="30px" BackColor="#6DC2FF" Font-Size="12px" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
<RowStyle Height="20px" Font-Size="12px" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
<Columns>
<asp:BoundField DataField="ProjID" HeaderText="ProjID" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" SortExpression="ProjID" />
<asp:BoundField DataField="Project_Name" HeaderText="Project Name Value" ReadOnly="True" SortExpression="Project_Name" />
<asp:BoundField DataField="Product" HeaderText="Product" SortExpression="Product" ReadOnly="True" />
<asp:BoundField DataField="Product_Edit" HeaderText="Product (alternate)" SortExpression="Product_Edit" />
<asp:BoundField DataField="Description" HeaderText="Description" ReadOnly="True" SortExpression="Description" />
<asp:BoundField DataField="Description_Edit" HeaderText="Description (alternate)" SortExpression="Description_Edit" />
<asp:BoundField DataField="Comment" HeaderText="Comment Submission/Approval" SortExpression="Comment" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="PopulateProjectTable" runat="server"
ConnectionString="<%$ ConnectionStrings:ODSConnectionString %>"
SelectCommand="SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail]"
UpdateCommand="UPDATE [Pipeline_Detail] SET Product_Edit = @Product_Edit, Description_Edit= @Description_Edit, Comment = @Comment WHERE ProjID = @ProjID">
<UpdateParameters>
<asp:Parameter Name="ProjID"/>
<asp:Parameter Name="Product_Edit" Type="String"/>
<asp:Parameter Name="Description_Edit" Type="String"/>
<asp:Parameter Name="Comment" Type="String"/>
</UpdateParameters>
</asp:SqlDataSource>
</div>
</form>
下面是我在后面的代码中的内容:
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SearchButton_Click(object sender, EventArgs e)
{
PopulateProjectTable.FilterExpression = SearchParameterList.SelectedValue.ToString() + " LIKE " + "'" + "%{0}%" + "'";
}
protected void ClearButton_Click(object sender, EventArgs e)
{
PopulateProjectTable.FilterExpression = "Project_Name LIKE '%%'";
SearchBox.Text = "";
}
}
非常贫瘠。我现在 运行 遇到的问题是我搜索后的分页 "resets" 本身。例如,如果我搜索无法在一页中显示的内容,它显然会分页显示。如果我单击不是第 1 页的 any/all 页,gridview 将重置回其原始 select 语句并显示 THAT 的第 2 页。我做了一些研究,发现这是数据绑定方式的问题(如果这不是这里的问题,请随时纠正我)。因此,我该如何解决我现在遇到的问题,是否需要我将我的 .aspx 页面转换为 C# 中的代码隐藏?
感谢您的帮助。
编辑:我对后面的代码进行了重大更改:
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SearchButton_Click(object sender, EventArgs e)
{
ProjectTable.PageIndex = 0;
ProjectTable.DataSourceID = null;
PopulateProjectTable.SelectCommand = "SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail] WHERE " + SearchParameterList.SelectedValue.ToString() + " LIKE '%" + SearchBox.Text + "%'";
ProjectTable.DataSource = PopulateProjectTable;
ProjectTable.DataBind();
}
protected void ClearButton_Click(object sender, EventArgs e)
{
ProjectTable.PageIndex = 0;
ProjectTable.DataSourceID = null;
PopulateProjectTable.SelectCommand = "SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail] WHERE Project_Name LIKE '%%'";
ProjectTable.DataSource = PopulateProjectTable;
ProjectTable.DataBind();
SearchBox.Text = "";
}
protected void ProjectTable_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
ProjectTable.PageIndex = e.NewPageIndex;
ProjectTable.DataSourceID = null;
PopulateProjectTable.SelectCommand = "SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail] WHERE " + SearchParameterList.SelectedValue.ToString() + " LIKE '%" + SearchBox.Text + "%'" ;
ProjectTable.DataSource = PopulateProjectTable;
ProjectTable.DataBind();
}
}
我现在遇到这些类型的错误:
The GridView 'ProjectTable' fired event RowEditing which wasn't handled.
The GridView 'ProjectTable' fired event RowCancelingEdit which wasn't handled.
有人知道怎么回事吗?
要解决分页问题,您需要在每次页面索引更改时重新绑定数据。您的标记的问题是,尽管您将 AllowPaging 设置为 true,但您从未实施过页面索引更改事件,因此当页面索引更改时数据会得到 "lost"。这是示例标记和隐藏代码。如果您需要进一步说明,请告诉我。
加价:
<asp:GridView ID="ProjectTable" runat="server" Font-Names="Verdana,Arial" Font-Size="12px" AutoGenerateColumns="False" AutoGenerateEditButton="True" DataSourceID="PopulateProjectTable" AllowPaging="True" OnPageIndexChaning="ProjectTable_PageIndexChanging">
隐藏代码:
protected void ProjectTable_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
//Set the page index
this.ProjectTable_PageIndexChanging.PageIndex = e.NewPageIndex;
//Rebind the data
this.ProjectTable_PageIndexChanging.DataSource = PopulateProjectTable;
this.ProjectTable_PageIndexChanging.DataBind();
}
在您的 Page_Load 事件中设置断点。
当您点击第 2 页时,您需要将数据重新绑定到您的网格。它通常涉及这样的事情:
if(Page.IsPostBack) {
ProjectTable.DataSource = [some collection which populates your grid]
ProjectTable.DataBind();
}
通过 Visual Studio 学习如何在 ASP.NET 中编码有其优点和缺点。优点是一切都可以通过拖放轻松完成,但缺点是我对背后的代码和所有这些 "data binding" 了解不多。我的 .aspx 页面中有这段代码,但我不确定如何将它 "convert" 到后面的代码中。例如,我现在正在尝试实现一个应用程序,该应用程序本质上是一个可搜索的应用程序(具有一个下拉列表,可作为要搜索的列的过滤器)具有具有读写功能的分页的 Gridview。这是我目前在 .aspx 页面中的代码:
<head runat="server">
<title></title>
<style>
.hiddencol
{
display: none;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="SearchBox" runat="server"></asp:TextBox>
<asp:DropDownList ID="SearchParameterList" runat="server">
<asp:ListItem Selected="True" Value="Project_Name">Project Name</asp:ListItem>
<asp:ListItem Value="Product">Product</asp:ListItem>
<asp:ListItem Value="Description">Description</asp:ListItem>
</asp:DropDownList>
<asp:Button ID="SearchButton" runat="server" Text="Search" OnClick="SearchButton_Click" />
<asp:Button ID="ClearButton" runat="server" OnClick="ClearButton_Click" Text="Clear" />
<br />
<br />
<asp:GridView ID="ProjectTable" runat="server" Font-Names="Verdana,Arial" Font-Size="12px" AutoGenerateColumns="False" AutoGenerateEditButton="True" DataSourceID="PopulateProjectTable" AllowPaging="True" OnPageIndexChanging="ProjectTable_PageIndexChanging>
<AlternatingRowStyle BackColor="#BFE4FF" />
<PagerStyle BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
<HeaderStyle Height="30px" BackColor="#6DC2FF" Font-Size="12px" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
<RowStyle Height="20px" Font-Size="12px" BorderColor="#CCCCCC" BorderStyle="Solid" BorderWidth="1px" />
<Columns>
<asp:BoundField DataField="ProjID" HeaderText="ProjID" ItemStyle-CssClass="hiddencol" HeaderStyle-CssClass="hiddencol" SortExpression="ProjID" />
<asp:BoundField DataField="Project_Name" HeaderText="Project Name Value" ReadOnly="True" SortExpression="Project_Name" />
<asp:BoundField DataField="Product" HeaderText="Product" SortExpression="Product" ReadOnly="True" />
<asp:BoundField DataField="Product_Edit" HeaderText="Product (alternate)" SortExpression="Product_Edit" />
<asp:BoundField DataField="Description" HeaderText="Description" ReadOnly="True" SortExpression="Description" />
<asp:BoundField DataField="Description_Edit" HeaderText="Description (alternate)" SortExpression="Description_Edit" />
<asp:BoundField DataField="Comment" HeaderText="Comment Submission/Approval" SortExpression="Comment" />
</Columns>
</asp:GridView>
<asp:SqlDataSource ID="PopulateProjectTable" runat="server"
ConnectionString="<%$ ConnectionStrings:ODSConnectionString %>"
SelectCommand="SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail]"
UpdateCommand="UPDATE [Pipeline_Detail] SET Product_Edit = @Product_Edit, Description_Edit= @Description_Edit, Comment = @Comment WHERE ProjID = @ProjID">
<UpdateParameters>
<asp:Parameter Name="ProjID"/>
<asp:Parameter Name="Product_Edit" Type="String"/>
<asp:Parameter Name="Description_Edit" Type="String"/>
<asp:Parameter Name="Comment" Type="String"/>
</UpdateParameters>
</asp:SqlDataSource>
</div>
</form>
下面是我在后面的代码中的内容:
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SearchButton_Click(object sender, EventArgs e)
{
PopulateProjectTable.FilterExpression = SearchParameterList.SelectedValue.ToString() + " LIKE " + "'" + "%{0}%" + "'";
}
protected void ClearButton_Click(object sender, EventArgs e)
{
PopulateProjectTable.FilterExpression = "Project_Name LIKE '%%'";
SearchBox.Text = "";
}
}
非常贫瘠。我现在 运行 遇到的问题是我搜索后的分页 "resets" 本身。例如,如果我搜索无法在一页中显示的内容,它显然会分页显示。如果我单击不是第 1 页的 any/all 页,gridview 将重置回其原始 select 语句并显示 THAT 的第 2 页。我做了一些研究,发现这是数据绑定方式的问题(如果这不是这里的问题,请随时纠正我)。因此,我该如何解决我现在遇到的问题,是否需要我将我的 .aspx 页面转换为 C# 中的代码隐藏?
感谢您的帮助。
编辑:我对后面的代码进行了重大更改:
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void SearchButton_Click(object sender, EventArgs e)
{
ProjectTable.PageIndex = 0;
ProjectTable.DataSourceID = null;
PopulateProjectTable.SelectCommand = "SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail] WHERE " + SearchParameterList.SelectedValue.ToString() + " LIKE '%" + SearchBox.Text + "%'";
ProjectTable.DataSource = PopulateProjectTable;
ProjectTable.DataBind();
}
protected void ClearButton_Click(object sender, EventArgs e)
{
ProjectTable.PageIndex = 0;
ProjectTable.DataSourceID = null;
PopulateProjectTable.SelectCommand = "SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail] WHERE Project_Name LIKE '%%'";
ProjectTable.DataSource = PopulateProjectTable;
ProjectTable.DataBind();
SearchBox.Text = "";
}
protected void ProjectTable_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
ProjectTable.PageIndex = e.NewPageIndex;
ProjectTable.DataSourceID = null;
PopulateProjectTable.SelectCommand = "SELECT [Project_Name], [Product], [Product_Edit], [Description], [Description_Edit], [Comment], [ProjID] FROM [Pipeline_Detail] WHERE " + SearchParameterList.SelectedValue.ToString() + " LIKE '%" + SearchBox.Text + "%'" ;
ProjectTable.DataSource = PopulateProjectTable;
ProjectTable.DataBind();
}
}
我现在遇到这些类型的错误:
The GridView 'ProjectTable' fired event RowEditing which wasn't handled.
The GridView 'ProjectTable' fired event RowCancelingEdit which wasn't handled.
有人知道怎么回事吗?
要解决分页问题,您需要在每次页面索引更改时重新绑定数据。您的标记的问题是,尽管您将 AllowPaging 设置为 true,但您从未实施过页面索引更改事件,因此当页面索引更改时数据会得到 "lost"。这是示例标记和隐藏代码。如果您需要进一步说明,请告诉我。
加价:
<asp:GridView ID="ProjectTable" runat="server" Font-Names="Verdana,Arial" Font-Size="12px" AutoGenerateColumns="False" AutoGenerateEditButton="True" DataSourceID="PopulateProjectTable" AllowPaging="True" OnPageIndexChaning="ProjectTable_PageIndexChanging">
隐藏代码:
protected void ProjectTable_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
//Set the page index
this.ProjectTable_PageIndexChanging.PageIndex = e.NewPageIndex;
//Rebind the data
this.ProjectTable_PageIndexChanging.DataSource = PopulateProjectTable;
this.ProjectTable_PageIndexChanging.DataBind();
}
在您的 Page_Load 事件中设置断点。
当您点击第 2 页时,您需要将数据重新绑定到您的网格。它通常涉及这样的事情:
if(Page.IsPostBack) {
ProjectTable.DataSource = [some collection which populates your grid]
ProjectTable.DataBind();
}