【问题标题】:Converting code from my .aspx page to code behind in the C# .cs page将我的 .aspx 页面中的代码转换为 C# .cs 页面中的代码
【发布时间】:2016-02-20 12:15:04
【问题描述】:

通过 Visual Studio 学习如何在 ASP.NET 中编写代码有利有弊。优点是一切都可以通过拖放轻松完成,但缺点是我对背后的代码和所有这些“数据绑定”知之甚少。我的 .aspx 页面中有这段代码,但我不确定如何将其“转换”为后面的代码。例如,我现在正在尝试实现一个本质上是可搜索的应用程序(它有一个下拉列表作为要搜索的列的过滤器),具有读取和写入功能的分页。这是我目前在 .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 = "";
    }
}

非常贫瘠。我现在遇到的问题是我搜索后分页“重置”了。例如,如果我搜索无法在一页中显示的内容,它显然会分页。如果我单击不是第 1 页的任何/所有页面,gridview 将重置回其原始选择语句并显示第 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.

有人知道怎么回事吗?

【问题讨论】:

  • 赞成,因为您显然对自己有智慧。如果今晚我下班时没有回答这个问题,我会试一试。我确实认为您的问题可能过于宽泛,无法给出简单的答案。
  • 非常感谢您的支持。从来没有上课,所以一切都是自学的。我自己能学到的只有这么多。
  • 由于您似乎渴望学习并且在学习过程的开始阶段,您可能希望完全放弃 Web 表单,因为它显然与行业的发展方向不符。改为学习 ASP.NET MVC。
  • 有意思,我去看看。不过,我想先完成这个。
  • @mason Webforms 不会去任何地方。

标签: c# asp.net gridview webforms


【解决方案1】:

要解决分页问题,​​您需要在每次页面索引更改时重新绑定数据。标记的问题是,尽管您将 AllowPaging 设置为 true,但您从未实现页面索引更改事件,因此当页面索引更改时数据会“丢失”。这是示例标记和后面的代码。如果您需要进一步说明,请告诉我。

标记:

<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 的代码?至于GetDataSource()方法,应该是怎样的?
  • Page_Load 应该没问题。看起来您正在使用 SqlDataSource 作为数据源,因此您可以将数据源设置为该数据源。检查我更新的答案。
  • 实际上,这行得通吗?既然我有一个搜索框,这不就是将数据设置回没有搜索框结果的第 2 页吗?
  • 然后您只需将其设置为搜索结果随附的相同数据即可。例如在数据绑定之前再次设置过滤表达式。
  • 谢谢,您为我指明了正确的方向。您的 aspx 页面中有拼写错误,其背后的代码让我有点失望。我用一些以前没有的有趣错误编辑了主要帖子。有什么想法吗?
【解决方案2】:

在 Page_Load 事件中设置断点。

当您单击第 2 页时,您需要将数据重新绑定到您的网格。它通常涉及这样的事情:

if(Page.IsPostBack) { 
  ProjectTable.DataSource = [some collection which populates your grid]
  ProjectTable.DataBind();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多