更改ASP.NET页面sql查询中的参数-使用按钮单击事件,在每次按钮单击中进行sql查询

更改ASP.NET页面sql查询中的参数-使用按钮单击事件,在每次按钮单击中进行sql查询,asp.net,sql,iterator,logic,code-behind,Asp.net,Sql,Iterator,Logic,Code Behind,我有一个ASP.NET页面,详细信息如下 Date OfficerID DutyID 25-NOV-13 2 666 26-NOV-13 2 666 27-NOV-13 2 666 28-NOV-13 2 666 29-NOV-13 2 666 30-NOV-13 2 666 01-DEC-13 2 666

我有一个ASP.NET页面,详细信息如下

 Date       OfficerID    DutyID
 25-NOV-13  2           666
 26-NOV-13  2           666
 27-NOV-13  2           666
 28-NOV-13  2           666
 29-NOV-13  2           666
 30-NOV-13  2           666
 01-DEC-13  2           666
 02-DEC-13  2           523
以上内容通过下面的代码段填充到gridview中

DataTable table = new DataTable();

string connectionString = GetConnectionString();
string sqlQuery = "select * from duty_rota where duty_date between sysdate and sysdate+18";


using (OracleConnection conn = new OracleConnection(connectionString))
{

    try
    {
        conn.Open();

        using (OracleCommand cmd = new OracleCommand(sqlQuery, conn))
        {
             using (OracleDataAdapter ODA = new OracleDataAdapter(cmd))
             {
                  ODA.Fill(table);
             }
        }
   }
   catch (Exception ex)
   {
         Response.Write("Not Connected" + ex.ToString());
   }

}

//DropDownList1.DataSource = table;
//DropDownList1.DataValueField = "";

GridView1.DataSource = table;
GridView1.DataBind();
现在我还有一个previous按钮,它应该输出相同的页面,但sql查询略有改变

select * from duty_rota where duty_date between sysdate-18 and sysdate;
每点击一次按钮,日期参数应减少18,也就是说,第一次点击前一个按钮,查询将被删除

sysdate-18 and sysdate
第二次点击

sysdate-36 and sysdate-18
第三次点击

sysdate-54 and sysdate-36
等等


请帮助我如何实现它,我试图用一个变量来实现它,该变量与之前的按钮单击事件关联,该事件将随着每次后续单击而改变。但我并不是真的能够做到这一点。有人能给我介绍一下吗。

在按钮点击事件中,尝试以下操作:

DataTable table = new DataTable(); 
string connectionString = GetConnectionString();
if (Session["sysdate"] == null || string.IsNullOrEmpty(Session["sysdate"].ToString()))
    Session["sysdate"] = "-18";
else
    Session["sysdate"] = "+ " + (Convert.ToInt32(Session["sysdate"]) - 18).ToString();
string sysdate = Session["sysdate"].ToString();
string sqlQuery = "select * from duty_rota where duty_date between sysdate " + sysdate + " and sysdate+18 " + sysdate;

using (OracleConnection conn = new OracleConnection(connectionString))
{
    try
    {
        conn.Open();

        using (OracleCommand cmd = new OracleCommand(sqlQuery, conn))
        {
             using (OracleDataAdapter ODA = new OracleDataAdapter(cmd))
             {
                  ODA.Fill(table);
             }
        }
   }
   catch (Exception ex)
   {
         Response.Write("Not Connected" + ex.ToString());
   }
}

GridView1.DataSource = table;
GridView1.DataBind();

编写以下代码以处理上一个和下一个按钮单击事件的动态查询:

protected void PrevioseButton_Click(object sender, EventArgs e)
{
    var sqlQuery = this.GenerateQuery(false);
    this.BindGrid(sqlQuery);
}

protected void NextButton_Click(object sender, EventArgs e)
{
    var sqlQuery = this.GenerateQuery(true);
    this.BindGrid(sqlQuery);
}

private string GenerateQuery(bool isNext)
{

    if (ViewState["fromDate"] == null && ViewState["toDate"] == null)
    {
        ViewState["fromDate"] = isNext ? "sysdate+18" : "sysdate-18";
        ViewState["toDate"] = isNext ? "sysdate+36" : "sysdate";
    }
    else
    {
        var from = ViewState["fromDate"].ToString().Replace("sysdate", string.Empty);
        var to = ViewState["toDate"].ToString().Replace("sysdate", string.Empty);

        int fromDay = 0;
        int toDay = 0;

        if (from != string.Empty)
        {
            fromDay = Convert.ToInt32(from);
        }

        if (to != string.Empty)
        {
            toDay = Convert.ToInt32(to);
        }

        if (!isNext)
        {
            fromDay = fromDay - 18;
            toDay = toDay - 18;
        }
        else
        {
            fromDay = fromDay + 18;
            toDay = toDay + 18;
        }

        from = "sysdate";
        to = "sysdate";
        if (fromDay > 0)
        {
            from += "+" + fromDay;
        }
        else if (fromDay < 0)
        {
            from += fromDay.ToString();
        }

        if (toDay > 0)
        {
            to += "+" + toDay;
        }
        else if (toDay < 0)
        {
            to += toDay.ToString();
        }

        ViewState["fromDate"] = from;
        ViewState["toDate"] = to;
    }

    var sqlQuery = "select * from duty_rota where duty_date between " + ViewState["fromDate"] + " and "
                            + ViewState["toDate"];

    return sqlQuery;
}

private void BindGrid(string sqlQuery)
{
    DataTable table = new DataTable();
    string connectionString = GetConnectionString();
    using (OracleConnection conn = new OracleConnection(connectionString))
    {

        try
        {
            conn.Open();

            using (OracleCommand cmd = new OracleCommand(sqlQuery, conn))
            {
                using (OracleDataAdapter ODA = new OracleDataAdapter(cmd))
                {
                    ODA.Fill(table);
                }
            }
        }
        catch (Exception ex)
        {
            Response.Write("Not Connected" + ex.ToString());
        }
    }

    GridView1.DataSource = table;
    GridView1.DataBind();
}
protectedvoid PrevioseButton\u单击(对象发送方,事件参数e)
{
var sqlQuery=this.GenerateQuery(false);
这个.BindGrid(sqlQuery);
}
受保护的void NextButton_Click(对象发送方,事件参数e)
{
var sqlQuery=this.GenerateQuery(true);
这个.BindGrid(sqlQuery);
}
私有字符串生成器(bool isNext)
{
如果(ViewState[“fromDate”]==null&&ViewState[“toDate”]==null)
{
ViewState[“fromDate”]=isNext?“sysdate+18”:“sysdate-18”;
ViewState[“toDate”]=isNext?“sysdate+36”:“sysdate”;
}
其他的
{
var from=ViewState[“fromDate”].ToString().Replace(“sysdate”,string.Empty);
var to=ViewState[“toDate”].ToString().Replace(“sysdate”,string.Empty);
int fromDay=0;
int今天=0;
if(from!=string.Empty)
{
fromDay=转换为32(从);
}
if(to!=string.Empty)
{
今天=转换为32(到);
}
如果(!isNext)
{
fromDay=fromDay-18;
今天=今天-18;
}
其他的
{
fromDay=fromDay+18;
今天=今天+18;
}
from=“sysdate”;
to=“sysdate”;
如果(fromDay>0)
{
from+=“+”+fromDay;
}
否则如果(从第天起<0)
{
from+=fromDay.ToString();
}
如果(今天>0)
{
到今天的+=“+”+;
}
否则如果(今天<0)
{
to+=今天。ToString();
}
ViewState[“fromDate”]=从;
ViewState[“toDate”]=to;
}
var sqlQuery=“select*from duty_rota,其中duty_日期介于”+ViewState[“fromDate”]+“和”
+视图状态[“toDate”];
返回sqlQuery;
}
私有void BindGrid(字符串sqlQuery)
{
DataTable=新的DataTable();
string connectionString=GetConnectionString();
使用(OracleConnection conn=新的OracleConnection(connectionString))
{
尝试
{
conn.Open();
使用(OracleCommand cmd=new OracleCommand(sqlQuery,conn))
{
使用(OracleDataAdapter ODA=新的OracleDataAdapter(cmd))
{
ODA.填写(表格);
}
}
}
捕获(例外情况除外)
{
写入(“未连接”+例如ToString());
}
}
GridView1.DataSource=表格;
GridView1.DataBind();
}

我认为ObjectDataSource控件可以完美地为您提供解决方案……但后来我意识到您的页面大小会有所不同

在这种情况下,需要将分页与gridview解除关联。这意味着分页应该是分开的,并且需要在网格视图中显示的数据需要分开。他们可能有一种像主人和孩子的关系。这意味着您需要单独的db调用来获取“每个”

分页部件可以由gridview或数据列表视图呈现


但是,如果gridview上的页面大小始终不变,您需要阅读以下内容:

它工作得非常好。使用视图状态的想法真是太棒了。只是一个简单的问题-你能帮我查询下一个按钮吗。我是这个Viewstate/Session的新手。我的意思是,查询将以sysdate递增,sysdate和sysdate+18之间的-DUTY\u DATE+18和sysdate.ok。我将在创建示例代码后更新我的答案。-谢谢,这将非常有帮助。我发现一个问题,当我单击“下一步”按钮时,首先填充SYSDATE和SYSDATE+18之间的日期,但理想情况下,它应该显示SYSDATE+18和SYSDATE+36之间的数据,您能帮助我如何解决它吗?