【发布时间】:2015-01-08 18:04:45
【问题描述】:
我有一个gridview,它允许您下载您检查的行的文件。它将文件下载到 .zip 文件中。一切正常,除了两件事:
- 如果我选择“检查所有”,它只会检查gridview 第一页中的所有内容。如果有足够多的数据包含一页以上,我怎样才能使全选实际上选择全部?
- 如果我在不同的页面上选中了复选框并单击了一个应该下载所有文件的按钮,它只会下载我当前正在查看的页面的文件。因此,如果我正在查看 gridview 第 2 页并下载选中的行,它只会下载我在第 2 页中选中的文件——即使我在第 1 页中选中了复选框。
这是我的代码:
复选框和网格视图:
private void RemoveRowIndex(int index)
{
SelectedShotIndex.Remove(index);
}
private void PersistRowIndex(int index)
{
if (!SelectedShotIndex.Exists(i => i == index))
{
SelectedShotIndex.Add(index);
}
}
private List<Int32> SelectedShotIndex
{
get
{
if (ViewState[SELECTED_SHOT_INDEX] == null)
{
ViewState[SELECTED_SHOT_INDEX] = new List<Int32>();
}
return (List<Int32>)ViewState[SELECTED_SHOT_INDEX];
}
}
private void RePopulateCheckBoxes()
{
foreach (GridViewRow row in gvSearchResultsUserAdmin.Rows)
{
var chkBox = row.FindControl("chkShot") as System.Web.UI.WebControls.CheckBox;
IDataItemContainer container = (IDataItemContainer)chkBox.NamingContainer;
if (SelectedShotIndex != null)
{
if (SelectedShotIndex.Exists(i => i == container.DataItemIndex))
{
chkBox.Checked = true;
}
}
}
}
protected void gvSearchResultsUserAdmin_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
gvSearchResultsUserAdmin.PageIndex = e.NewPageIndex;
if (Session["gvSearchResultsUserAdmin"] != null)
{
gvSearchResultsUserAdmin.DataSource = Session["gvSearchResultsUserAdmin"];
}
else
{
//gvSearchResultsUserAdmin.DataSource = ds;
}
foreach (GridViewRow row in gvSearchResultsUserAdmin.Rows)
{
var chkBox = row.FindControl("chkShot") as System.Web.UI.WebControls.CheckBox;
IDataItemContainer container = (IDataItemContainer)chkBox.NamingContainer;
if (chkBox.Checked)
{
PersistRowIndex(container.DataItemIndex);
}
else
{
RemoveRowIndex(container.DataItemIndex);
}
}
LoadGridView();
//gvSearchResultsUserAdmin.DataBind();
RePopulateCheckBoxes();
}
选择所有复选框:
protected void chkboxSelectAll_CheckedChanged(object sender, EventArgs e)
{
try
{
System.Web.UI.WebControls.CheckBox ChkBoxHeader = (System.Web.UI.WebControls.CheckBox)gvSearchResultsUserAdmin.HeaderRow.FindControl("chkboxSelectAll");
foreach (GridViewRow row in gvSearchResultsUserAdmin.Rows)
{
System.Web.UI.WebControls.CheckBox ChkBoxRows = (System.Web.UI.WebControls.CheckBox)row.FindControl("chkShot");
if (ChkBoxHeader.Checked == true)
{
ChkBoxRows.Checked = true;
}
else
{
ChkBoxRows.Checked = false;
}
}
}
catch (Exception)
{
}
}
}
我的“全部下载”按钮:
protected void btnDownloadShots_Click(object sender, EventArgs e)
{
using (ZipFile zip = new ZipFile())
{
try
{
foreach (GridViewRow gvrow in gvSearchResultsUserAdmin.Rows)
{
System.Web.UI.WebControls.CheckBox chk = (System.Web.UI.WebControls.CheckBox)gvrow.FindControl("chkShot");
if (chk.Checked)
{
SqlCommand objcmd = new SqlCommand();
try
{
filmName = gvrow.Cells[1].Text;
shotNumber = int.Parse(gvrow.Cells[2].Text);
}
catch (Exception ex)
{
}
objcmd.CommandType = CommandType.StoredProcedure;
objcmd.CommandText = "ShotIDfromSearch";
objcmd.Parameters.AddWithValue("@filmName", filmName);
objcmd.Parameters.AddWithValue("@shotNumber", shotNumber);
ds = objdb.getDataSetUsingCmdObj(objcmd);
shotID = ds.Tables[0].Rows[0].Field<int>("ShotID");
FilePath = ReturnFilePath(shotID);
//Response.ForceDownload(FilePath, filmName + " - Shot " + shotNumber.ToString() + ".mp4");
zip.AddFile(FilePath, filmName);
}
}
}
catch (Exception)
{
}
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=Vertov.zip");
Response.ContentType = "application/zip";
zip.Save(Response.OutputStream);
Response.End();
}
}
【问题讨论】:
标签: c# asp.net gridview checkbox paging