获取 .aspx 和 .aspx.cs 文件中的日期范围

问题描述 投票:0回答:1

我正在尝试在前端和后端构建日期范围显示,以便当用户在两个日期之间进行选择时,它会过滤这两个点之间的信息。到目前为止,我仅在前端的第一部分遇到问题,并根据我在网上看到的一些示例成功地提出了这个问题

    <details>
        <div class="row">
            <div class="col-auto">
                <asp:Repeater ID="rFilterDateStarts" RunAt="Server">
                    <ItemTemplate>
                        <label class="form-label">Date From:</label>
                        <asp:TextBox AutoPostBack="true" ClientIDMode="Static" ID="txtDateStart" RunAt="Server" TextMode="Date" />
                        <button type="button" class="btn btn-outline-secondary badge rounded-pill text-body-emphasis"><%# Eval("created_date", "{0:yyyy-MM-dd}") %></button>
                    </ItemTemplate>
                </asp:Repeater>
            </div>

        <div class="col-auto">
            <asp:Repeater ID="rFilterDateEnds" RunAt="Server">
                <ItemTemplate>
                    <label class="form-label">Date To:</label>
                    <asp:TextBox AutoPostBack="true" ClientIDMode="Static" ID="txtDateEnds" RunAt="Server" TextMode="Date" />
                    <button type="button" class="btn btn-outline-secondary badge rounded-pill text-body-emphasis"><%# Eval("created_date", "{0:yyyy-MM-dd}") %></button>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </div>
</details>

我对 C# 非常陌生,想知道这是否正确,或者我的方向是错误的。

我尝试按照我在网上找到的块代码中的 C# 和 SQl 示例进行操作。

<div class='container'>
    <div class="row">
        From:<asp:TextBox ID="txtFromDate" runat="server" class="form-control date-input" ReadOnly="true" />
    </div>
    <div class="row">
        To:<asp:TextBox ID="txtToDate" runat="server" class="form-control date-input" ReadOnly="true" />
    </div>
    <hr />
    <asp:GridView ID="gvEmployees" runat="server" AutoGenerateColumns="false" CssClass="table table-responsive table-bordered">
        <Columns>
            <asp:BoundField DataField="Id" HeaderText="Id" />
            <asp:BoundField DataField="Name" HeaderText="Name" />
            <asp:BoundField DataField="OrderDate" HeaderText="Date" DataFormatString="{0:dd/MMM/yyyy}" />
        </Columns>
    </asp:GridView>
    <br />
    <asp:Button Text="Filter" runat="server" OnClick="OnFilter" />
</div>

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        gvEmployees.DataSource = GetData("", "");
        gvEmployees.DataBind();
    }
}

protected void OnFilter(object sender, EventArgs e)
{
    DateTime fromDate = Convert.ToDateTime(txtFromDate.Text);
    DateTime toDate = Convert.ToDateTime(txtToDate.Text);
    gvEmployees.DataSource = GetData(fromDate.ToString(), toDate.ToString());
    gvEmployees.DataBind();
}

private DataTable GetData(string fromDate, string toDate)
{
    string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
    SqlCommand cmd = new SqlCommand();
    string query = "SELECT * FROM Employees";
    if (!string.IsNullOrEmpty(fromDate) && !string.IsNullOrEmpty(toDate))
    {
        query += "WHERE OrderDate BETWEEN @From AND @To";
        cmd.Parameters.AddWithValue("@From", fromDate);
        cmd.Parameters.AddWithValue("@To", toDate);
    }
    using (SqlConnection con = new SqlConnection(conString))
    {
        using (SqlDataAdapter sda = new SqlDataAdapter())
        {
            cmd.Connection = con;
            cmd.CommandText = query;
            sda.SelectCommand = cmd;
            using (DataTable dt = new DataTable())
            {
                sda.Fill(dt);
                return dt;
            }
        }
    }
}
c# asp.net asp.net-web-api
1个回答
0
投票

完全不清楚为什么要介绍中继器。我建议你把它扔掉。

放入 2 个文本框(TextMode = 日期,这将为您提供一个日期选择器,而无需您做任何额外的努力)。

在 2 个文本框(和我们的搜索按钮)之后,只需添加您的 GridView。

因此,这个标记:

        <h3>Search Hotel Bookings</h3>

        <div style="float: left">
            <h4>Enter start date</h4>
            <asp:TextBox ID="txtStartDate" runat="server"
                TextMode="Date">
            </asp:TextBox>
        </div>

        <div style="float: left; margin-left: 30px">
            <h4>Enter start date</h4>
            <asp:TextBox ID="txtEndDate" runat="server"
                TextMode="Date">
            </asp:TextBox>
        </div>
        <asp:Button ID="cmdSearch" runat="server"
            Style="float: left; margin-left: 30px; margin-top: 20px"
            Text="Search Bookings"
            CssClass="btn"
            OnClick="cmdSearch_Click" />

        <%--        Start a new line--%>

        <div style="clear: both; height: 10px"></div>

        <asp:GridView ID="GridView1" runat="server"
            CssClass="table table-hover"
            Width="50%"
            AutoGenerateColumns="False" DataKeyNames="ID">
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" />
                <asp:BoundField DataField="City" HeaderText="City" />
                <asp:BoundField DataField="HotelName" HeaderText="Hotel" />
                <asp:BoundField DataField="Description" HeaderText="Description" />
                <asp:BoundField DataField="BookingDate"
                    HeaderText="Booking Date" DataFormatString="{0:d}"
                    ItemStyle-Width="110px" />
            </Columns>
        </asp:GridView>

我们的后台代码可以是这样的:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            // optinal load all of grid on first page load
            LoadGrid();
        }
    }

    void LoadGrid()
    {
        string strSQL =
            "SELECT * FROM tblHotelsA ";

        SqlCommand cmdSQL = new SqlCommand(strSQL); 
        if (txtStartDate.Text.Trim().Length > 0 
            & txtStartDate.Text.Trim().Length > 0 )
        {
            cmdSQL.CommandText += "WHERE BookingDate BETWEEN @Start AND @End ";
            cmdSQL.Parameters.Add("@Start", SqlDbType.Date).Value = txtStartDate.Text;
            cmdSQL.Parameters.Add("@End", SqlDbType.Date).Value = txtEndDate.Text;
        }
        cmdSQL.CommandText += "ORDER BY BookingDate ";
        GridView1.DataSource = MyRstP(cmdSQL);
        GridView1.DataBind();
    }

    protected void cmdSearch_Click(object sender, EventArgs e)
    {
        LoadGrid();

    }

    public DataTable MyRstP(SqlCommand cmdSQL)
    {
        DataTable rstData = new DataTable();
        using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.TEST4))
        {
            using (cmdSQL)
            {
                cmdSQL.Connection = conn;
                conn.Open();
                rstData.Load(cmdSQL.ExecuteReader());
            }
        }
        return rstData;
    }

事实上,我建议将 MyRstP“帮助程序”路由移至全局静态类,这样您就不必一遍又一遍地编写此类代码。

最终结果是:

首先,我们选择开始和结束日期:

enter image description here

然后我们点击搜索按钮

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.