“查找并保存”功能无法正常工作

时间:2015-05-28 23:24:18

标签: c# asp.net gridview checkbox datatable

第一次发布海报,很长一段时间潜伏着。我的ASP.NET页面遇到了一些问题,希望有人能帮我解决问题。

基本上,我在gridview中有一堆复选框,还有两个按钮:“查找”按钮和“保存”按钮。 'find'可以设置复选框的值,但如果用户取消选中它,我想在用户点击'save'时捕获该更改。目前,它不起作用。

相关ASPX:

<%@ Page Language="C#" AutoEventWireup="true" EnableViewState="true" CodeBehind="FindTransactions.aspx.cs" Inherits="Basic.FindTransactions" MasterPageFile="~/Trans.Master" %>

相关守则背后:

页:

public partial class FindTransactions : System.Web.UI.Page
{
    GridView _gridview = new GridView() { ID = "_gridView" };
    DataTable _datatable = new DataTable();
    Int32 _buyerID = new Int32();

    protected void Page_Load(object sender, EventArgs e)
    {
    }

“查找”按钮:

protected void Find_Click(object sender, EventArgs e)
{
    //truncated 
    _datatable.Rows.Add(
    //filled with other data from a custom object.
    );

    ViewState["_datatable"] = _datatable;
    ViewState["_buyerID"] = _buyerID;
    BuildGridView((DataTable)ViewState["_datatable"],(Int32)ViewState["buyerID"]);

}

BuildGridView函数:

protected void BuildGridView(DataTable d, Int32 b)
{
    _gridview.DataKeyNames = new String[] {"Transaction ID"};
    _gridview.AutoGenerateColumns = false;
    _gridview.RowDataBound += new GridViewRowEventHandler(OnRowDataBound);

    for(Int32 i = 0; i < d.Columns.Count; i++)
    {
        Boundfield boundfield = new BoundField();
        boundfield.DataField = d.Columns[i].ColumnName.ToString();
        boundfield.HeaderText = d.Columns[i].ColumnName.ToString();
        _gridview.Columns.Add(boundfield);
    }

    _gridview.DataSource = d;
    _gridview.DataBind();
    //truncated
    Panel1.Controls.Add(_gridview);
}

行绑定事件处理程序:

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        String controlID = "checkBox";
        CheckBox c = new CheckBox() { ID = controlID};
        c.Enabled = true;

        Boolean success;
        Boolean v;
        success = Boolean.TryParse(e.Row.Cells[8].Text, out v);
        e.Row.Cells[8].Controls.Add(c);

        if (success)
        {
            c.Checked = v;
            if (c.Checked)
            {
                //Will uncomment once other things work
                //e.Row.Visible = false;
            }
        }
        else
        {
            c.Checked = false;
        } 
    }
}

所有这些都有效。这是它开始崩溃的地方:

“保存”按钮:

protected void Save_Click(object sender, EventArgs e)
{
    //Both for troubleshooting and both return 0. (Expected for datatable)
    Label1.Text = _gridview.Rows.Count.ToString();
    Label2.Text = _datatable.Rows.Count.ToString();

    /*truncated
    */
    if (grid.Rows.Count == 0)
    {
        BuildGridView((DataTable)ViewState["infoTable"], (Int32)ViewState["guestID"]);
    }
    foreach (GridViewRow r in grid.Rows)
    {
        if (r.RowType == DataControlRowType.DataRow)
        {
             CheckBox cb = (CheckBox)r.FindControl("checkBox");
             if (cb != null && cb.Checked)
             {
                 //This never seems to modify the label.
                 //Will put code to modify database here.
                 Label2.Text += "Hi " + r.RowIndex.ToString();
             }
         }
     }
 }

点击“保存”按钮后,发生PostBack并且GridView为空(Rows.Count为0)。在我有机会遍历GridView行以确定复选框值之前,ViewState似乎丢失了。

最后,我只想通过点击“保存”按钮来捕获这些复选框的状态,通过用户交互改变或不改变。

我发现了其他一些文章,但是当我尝试实施各种修补程序时,其中很多文章都没有用。

这个似乎是描述我的问题的最接近的,代码的结构类似,但我不太明白如何实现修复:GridView doesn't remember state between postbacks

[用于说明问题的新简化代码:]

namespace GridViewIssue
{
    public partial class GridViewNoMaster : System.Web.UI.Page
    {
        GridView _gridView = new GridView() { ID = "_gridView" };
        DataTable _dataTable = new DataTable();

        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Find_Click(object sender, EventArgs e)
        {
            BuildDataTable();

            List<String> list = new List<String>();
            list.Add("1");
            list.Add("User");
            list.Add("10/12/2014");

            foreach (String s in list)
            {
                _dataTable.Rows.Add(
                    list[0],
                    list[1],
                    list[2]
                    );
            }

            BuildGridView();
            //Feedback.Text = _gridView.Rows.Count.ToString();
        }

        protected void Save_Click(object sender, EventArgs e)
        {
            Feedback.Text = "Save Clicked, PostBack: " + IsPostBack + ", GridView Row Count: " + _gridView.Rows.Count + ", GridView ViewState: " + _gridView.EnableViewState;
            foreach (GridViewRow r in _gridView.Rows)
            {
                if(r.RowType == DataControlRowType.DataRow)
                {
                     Feedback.Text = "In DataRow type" + _gridView.Rows.Count;
                }
            }
        }

        protected void BuildDataTable()
        {
            _dataTable.Columns.Add("Transaction ID", typeof(String));
            _dataTable.Columns.Add("Name", typeof(String));
            _dataTable.Columns.Add("Date", typeof(String));
        }

        protected void BuildGridView()
        {
            for (Int32 i = 0; i < _dataTable.Columns.Count; i++)
            {
                BoundField b = new BoundField();
                b.DataField = _dataTable.Columns[i].ColumnName.ToString();
                b.HeaderText = _dataTable.Columns[i].ColumnName.ToString();
                _gridView.Columns.Add(b);
            }

            _gridView.DataKeyNames = new String[] { "Transaction ID" };
            _gridView.AutoGenerateColumns = false;
            _gridView.DataSource = _dataTable;
            _gridView.DataBind();

            Panel1.Controls.Add(_gridView);
        }
    }
}

0 个答案:

没有答案