当前场景
第一个操作:使用传递给sqldatasource中Select comman的sql查询加载gridview中的数据。(使用过程按钮-执行查询功能)
第二个操作:当该行的日期也存在于另一个表-折扣表中时,选中每行网格视图中的复选框(USING RECOMPUTE BUTTON-CheckApproveDisc函数)
这是代码:
protected void btnProcess_Click(object sender, EventArgs e)
}
executeQuery();
}
protected void btnRecompute_Click(object sender, EventArgs e)
{
CheckApproveDisc();
}
和
public void executeQuery()
{
if ((ddlLoc.SelectedValue == "ALL LOCATIONS") && (ddlRP.SelectedValue == "PER RETAIL PARTNER"))
{
if (txtSearchedRP.Text == "")
{
string script = "alert("Please select a Retail Partner");";
ScriptManager.RegisterStartupScript(this, GetType(),
"ServerControlScript", script, true);
}
else
{
dstrQuery = @"select a.tenantcode, b.name , convert(varchar(10), a.date, 101) as Date, datename(weekday, a.date) as Day,
convert(varchar,cast(SUM(a.surcharge ) as money),1) AS Surcharge,
convert(varchar,cast(SUM(a.senior) as money),1) as senior,
convert(varchar,cast((((SUM(a.senior))/0.20)*0.80) as money),1) as VATExemptSales,
convert(varchar,cast(SUM(a.other) as money),1) as Other,
convert(varchar,cast(SUM(a.refund) as money),1)as Refund,
convert(varchar,cast(SUM(a.void) as money),1) as Void,
case when a.date IN (select Z.date from discount z where z.date between '"+ txtdatefrom.Text +"' and '"+ txtdateto.Text +"' and z.tenantcode = '" + hdnRP.Value + "') THEN (convert(varchar,cast(((sum(a.cash) + SUM(a.charge) + SUM(a.gift)) - (SUM(a.surcharge))) as money),1) ) ELSE convert(varchar,cast(((sum(a.cash) + SUM(a.charge) + SUM(a.gift)+ SUM(a.other)) - (SUM(a.surcharge))) as money),1) end as GSC, convert(varchar,cast(SUM(a.cash ) as money),1) as Cash, convert(varchar,cast(SUM(a.charge ) as money),1) as Charge, convert(varchar,cast(SUM(a.gift ) as money),1) as Gift from TENANT b inner join LOCATION c on b.location=c.location inner join DAILY a on a.tenantcode=b.tenantcode where (a.date between '" + txtdatefrom.Text + "' and '" + txtdateto.Text + "') and (a.tenantcode = '" + hdnRP.Value + "') GROUP BY a.tenantcode, b.name, a.date order by a.date ";
sqlDataSourceDSRTender.SelectCommand = dstrQuery;
}
}
CheckApproveDisc();
}
--
public void CheckApproveDisc()
{
int RecordCount = 0;
string datepass;
foreach (GridViewRow row in grdDSTR.Rows)
{
if (row.RowType == DataControlRowType.DataRow)
{
CheckBox chkRow = (row.Cells[0].FindControl("chkCheckRow") as CheckBox);
try
{
datepass = (row.Cells[2].Text);
DateTime dt = Convert.ToDateTime(datepass);
string queryString = "select COUNT(*) from DISCOUNT Where date = '" + dt + "' and tenantcode = '" + hdnRP.Value + "'";
SqlCommand cmd = new SqlCommand(queryString, con);
con.Open();
RecordCount = Convert.ToInt32(cmd.ExecuteScalar());
if (RecordCount == 1)
{
chkRow.Checked = true;
}
con.Close();
}
catch (Exception)
{
Response.Write("Something wrong happened");
}
}
}
}
我想要实现的目标
要在一个按钮中执行两个操作,请仅单击。我尝试在Process Button中包含两个函数,但它不起作用,可能是因为系统还没有加载网格视图数据,所以迭代过程、测试每一行都不起作用。
有其他方法或替代方案可以实现这一点吗?
--
更新
我认为这是部分答案,但它不是100%准确的,我在复选框中包含了数据绑定属性(请参阅下面的代码)。这里剩下的问题是最后一行没有检查或没有对gridview 的最后一行生效
<asp:GridView ID="grdDSTR" runat="server" DataSourceID="sqlDataSourceDSRTender" EmptyDataText="No Records Found"
ShowHeaderWhenEmpty="True" AllowPaging="True" AutoGenerateColumns="False" BackColor="White" BorderColor="#DEDFDE"
BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Vertical" width="100%" Font-Size="Smaller" PageSize="31" >
<emptydatarowstyle backcolor="white" forecolor="black"/> <emptydatatemplate> No Data Found.</emptydatatemplate>
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:CheckBox ID="chkCheckRow" runat="server" OnDataBinding="btnProcess_Click" />
</ItemTemplate>
<HeaderTemplate>
<asp:CheckBox ID="ckhCheckAll" runat="server" onclick="GridSelectAllColumn(this);" />
</HeaderTemplate>
</asp:TemplateField>
"一键执行两个操作"?我建议你试试BackgroundWorker。要了解如何在web应用程序上使用BackgroundWorker,请参阅此问题。或者很重要。在要使用backgroundworker的页面上添加Async="true",如下所示。如果你正在使用桌面应用程序,你不需要这行代码。
<%@ Page Language="C#" AutoEventWireup="true" ... Inherits="_Default" Async ="true" %>
///
protected void btnProcess_Click(object sender, EventArgs e)
{
BackgroundWorker w = new BackgroundWorker();
w.DoWork += new DoWorkEventHandler(doWork)
w.RunWorkerCompleted += new RunWorkerCompletedEventHandler(workComplete);
if (w.IsBusy != true)
{
// Start the asynchronous operation.
w.RunWorkerAsync();
}
}
protected void doWork(object sender, DoWorkEventArgs e)
{
//Put your executeQuery(); here
if ((ddlLoc.SelectedValue == "ALL LOCATIONS") && (ddlRP.SelectedValue == "PER RETAIL PARTNER"))
{
if (txtSearchedRP.Text == "")
{
string script = "alert("Please select a Retail Partner");";
ScriptManager.RegisterStartupScript(this,
GetType(),"ServerControlScript",script, true);
}
else
{
dstrQuery = @"select a.tenantcode, b.name , convert(varchar(10), a.date, 101) as Date, datename(weekday, a.date) as Day,
convert(varchar,cast(SUM(a.surcharge ) as money),1) AS Surcharge,
convert(varchar,cast(SUM(a.senior) as money),1) as senior,
convert(varchar,cast((((SUM(a.senior))/0.20)*0.80) as money),1) as VATExemptSales,
convert(varchar,cast(SUM(a.other) as money),1) as Other,
convert(varchar,cast(SUM(a.refund) as money),1)as Refund,
convert(varchar,cast(SUM(a.void) as money),1) as Void,
case when a.date IN (select Z.date from discount z where z.date between '"+ txtdatefrom.Text +"' and '"+ txtdateto.Text +"' and z.tenantcode = '" + hdnRP.Value + "') THEN (convert(varchar,cast(((sum(a.cash) + SUM(a.charge) + SUM(a.gift)) - (SUM(a.surcharge))) as money),1) ) ELSE convert(varchar,cast(((sum(a.cash) + SUM(a.charge) + SUM(a.gift)+ SUM(a.other)) - (SUM(a.surcharge))) as money),1) end as GSC, convert(varchar,cast(SUM(a.cash ) as money),1) as Cash, convert(varchar,cast(SUM(a.charge ) as money),1) as Charge, convert(varchar,cast(SUM(a.gift ) as money),1) as Gift from TENANT b inner join LOCATION c on b.location=c.location inner join DAILY a on a.tenantcode=b.tenantcode where (a.date between '" + txtdatefrom.Text + "' and '" + txtdateto.Text + "') and (a.tenantcode = '" + hdnRP.Value + "') GROUP BY a.tenantcode, b.name, a.date order by a.date ";
sqlDataSourceDSRTender.SelectCommand = dstrQuery;
}
}
//Bind your gridview.
}
protected void workComplete(object sender, RunWorkerCompletedEventArgs e)
{
//This event is called when the dowork complete
CheckApproveDisc();
}
BAckgroundworker是一个强大的阶层。它已成功更改事件。您可以将您的所有信息和进度(如string script = "alert("Please select a Retail Partner");";
)带到这里。你的网格也可以根据进度变化或只是在工作中进行绑定。一切完成后,您可以在workercomplete方法中执行复选框检查事件。这是一个功能强大的类,请检查msdn页面和上面提到的链接。
更新
至于上面的OndataBinding事件,如果最后一行没有更新,那就很清楚了。可能是recordcount
在最后一行不等于1。在那里放置一个断点,然后查看。可能是您的查询在最后一行返回空。情况可能就是这样。放一个断点看看。