将GridView与日历链接

时间:2014-05-02 12:13:46

标签: c# asp.net sql-server

我有一个运行时带有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

2 个答案:

答案 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完成此操作非常相似):

ASP.NET GridView Filtering with DropDownList