我正在尝试在前端和后端构建日期范围显示,以便当用户在两个日期之间进行选择时,它会过滤这两个点之间的信息。到目前为止,我仅在前端的第一部分遇到问题,并根据我在网上看到的一些示例成功地提出了这个问题
<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;
}
}
}
}
完全不清楚为什么要介绍中继器。我建议你把它扔掉。
放入 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“帮助程序”路由移至全局静态类,这样您就不必一遍又一遍地编写此类代码。
最终结果是:
首先,我们选择开始和结束日期:
然后我们点击搜索按钮