我有一个运行时带有DateTime属性的列的数据库。我的想法是抓住该列并将其链接到GridView。然后将日历链接到它,这样我就可以选择一天,并且所有与数据库列中的日期相同的记录都会显示在GridView中。
那么,如何将Calendar链接到GridView?
当前设置
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
//build up a connection and fill the gridview
SqlConnection conn;
SqlCommand comm;
SqlDataReader reader;
string connectionString = ConfigurationManager.ConnectionStrings["LoginProject"].ConnectionString;
conn = new SqlConnection(connectionString);
comm = new SqlCommand("FillGridByCalendar", conn);
comm.CommandType = CommandType.StoredProcedure;
comm.Parameters.AddWithValue("@UserId", System.Data.SqlDbType.UniqueIdentifier);
comm.Parameters.AddWithValue("@Firstname", System.Data.SqlDbType.NVarChar);
comm.Parameters.AddWithValue("@Lastname", System.Data.SqlDbType.NVarChar);
comm.Parameters.AddWithValue("@UserLoginPerDay", System.Data.SqlDbType.DateTime);
try
{
conn.Open();
reader = comm.ExecuteReader();
GridView2.DataSource = reader;
GridView2.DataBind();
reader.Close();
}
catch (Exception ex)
{
dbErrorLabel.Text = Convert.ToString(ex);
}
finally
{
conn.Close();
}
}
和(改变的)程序。
ALTER PROCEDURE [dbo].[FillGridByCalendar]
@UserLoginPerDay datetime,
@Firstname nvarchar,
@Lastname nvarchar,
@UserId uniqueidentifier
@datefilter -- Not sure what to add here
AS
BEGIN
SELECT UserLoginToday.UserId, Gebruikers.Lastname, Gebruikers.Firstname, UserLoginToday.UserLoginPerDay
FROM Gebruikers INNER JOIN UserLoginToday
ON Gebruikers.UserId = UserLoginToday.UserId
WHERE (UserLoginToday.UserLoginPerDay = ISNULL(@datefilter, UserLoginToday.UserLoginPerDay))
END
答案 0 :(得分:1)
欢迎来到Stack Overflow ......呃......捐赠者......
您可以在这里获得很好的回复和建议,但是您应该尝试包含您尝试过的任何代码。这里的人希望看到您已经尝试了某些内容,如果我们能够看到您的代码,它可以帮助我们诊断您的问题。
编辑:我已经添加了一些细节 - 此外,您不需要在日历控件上进行自动回复。
假设你已经有了你的sql数据源,你需要添加几个东西。
在数据源的select命令中,您需要添加此...
WHERE yourtable.nameofdatefield = ISNULL(@datefilter, yourtable.nameofdatefield)
所以它看起来像这样......
SelectCommand="SELECT stuff FROM yourtable WHERE yourtable.nameofdatefield = ISNULL(@datefilter, yourtable.nameofdatefield)"
在您的命令之后,您需要添加此...
CancelSelectOnNullParameter="false"
在sqldatasource的参数部分中,添加此
<asp:ControlParameter Name="datefilter" ControlID="yourcalendarid" PropertyName="SelectedValue" />
所以它看起来像这样......
<SelectParameters>
<asp:ControlParameter Name="datefilter" ControlID="yourcalendarid" PropertyName="SelectedValue" />
</SelectParameters>
现在,在您的aspx中,无论您喜欢什么,都需要一个带有autopostback的日历=&#34; true&#34;
在设计视图中,双击日历,这将在后面的代码中创建一个方法。
在新方法中,写下......
[id of your gridview].databind();
所以在这里看起来应该是什么......
您的数据源看起来应该是这样的......
<asp:SqlDataSource ID="yoursqldatasourceid" runat="server"
ConnectionString="<%$ ConnectionStrings:nameofyourconnection %>"
DeleteCommand="you may or may not be deleting things"
InsertCommand="you may or may not be inserting things"
UpdateCommand="you may or may not be deleting things"
SelectCommand="SELECT stuff FROM yourtable WHERE yourtable.nameofdatefield = ISNULL(@datefilter, yourtable.nameofdatefield)"
CancelSelectOnNullParameter="false"
>
<SelectParameters>
<asp:ControlParameter Name="datefilter" ControlID="yourcalendarid" PropertyName="SelectedValue" />
</SelectParameters>
<DeleteParameters>
<asp:Parameter Name="id" Type="Int32" />
</DeleteParameters>
<InsertParameters>
some insert parameters that you may or may not need...
</InsertParameters>
<UpdateParameters>
some update parameters that you may or may not need...
</UpdateParameters>
</asp:SqlDataSource>
你应该有一个看起来像这样的日历控件......
<asp:Calendar ID="Calendar1" runat="server" OnSelectionChanged="Calendar1_SelectionChanged" ></asp:Calendar>
你的代码隐藏中的一种新方法就是这样......
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
yoursqldatasourceid.databind();
}
如果您仍然输了,请告诉我,我们可以解决这个问题......
答案 1 :(得分:0)
据我所知,您希望按日期对GridView应用过滤。您可以使用SqlDataSource。示例文章展示了如何将过滤应用于GridView(使用DropDowns但使用Calendar完成此操作非常相似):