asp.net gridview外部按钮保存

时间:2012-12-08 15:04:27

标签: asp.net gridview

我在运行时动态构建gridview并绑定到datatable,并使用按钮保存gridview外部的gridview数据

1-创建GridView

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
         CreateGrid();
    }
}

      void CreateGrid()
      {
                int nTransID = Convert.ToInt32(Session["trans_id"]);
                //
                string strSQL = @"EXEC [dbo].[sp_GetTransaction] " + nTransID;
                DataTable dtData = clsGlobal.GetDataTable(strSQL);
                //
                if (ViewState["dtTransDetail"] == null) ViewState.Add("dtTransDetail", dtData);
                else ViewState["dtTransDetail"] = dtData;
                //
                foreach (DataColumn dc in dtData.Columns)
                {
                    if (dc.ColumnName.Contains("!;"))
                    {
                        TemplateField tField = new TemplateField();
                        tField.ItemTemplate = new AddTemplateToGridView(ListItemType.Item, dc.ColumnName);
    //\\ --- template contain textbox
                        tField.HeaderText = dc.ColumnName;
                        GridView1.Columns.Add(tField);
                    }
                }
            }

这是我的模板类:

public class AddTemplateToGridView : ITemplate
    {
        ListItemType _type;
        string _colName;

        public AddTemplateToGridView(ListItemType type, string colname)
        {
            _type = type;
            _colName = colname;
        }

        void ITemplate.InstantiateIn(System.Web.UI.Control container)
        {
            switch (_type)
            {
                case ListItemType.Item:
                    TextBox text = new TextBox();
                    text.ID = "txtAmount";
                    text.DataBinding += new EventHandler(txt_DataBinding);
                    container.Controls.Add(text);
                    break;
            }
        }

        void txt_DataBinding(object sender, EventArgs e)
        {
            TextBox textBox = (TextBox)sender;
            GridViewRow container = (GridViewRow)textBox.NamingContainer;
            object dataValue = DataBinder.Eval(container.DataItem, _colName);
            if (dataValue != DBNull.Value)
            {
                textBox.Text = dataValue.ToString();
            }
        }  
    }

所以我有一个带有textboxe的gridview,可以立即进行编辑 问题是,当我点击保存按钮"这是在gridview"之外所有文字框都消失了

protected void btnSave_Command(object sender, CommandEventArgs e)
        {
for (int nRow = 0; nRow < GridView1.Rows.Count; nRow++)
            {
                for (int nCol = 0; nCol < GridView1.Columns.Count; nCol++)
                {
                    if (GridView1.Rows[nRow].Cells[nCol].Controls.Count == 0) continue;
//\\ --- Controls.Count always = 0
//\\ --- However each cell contain textbox
//\\ --- textbox disappear after save button clicked
                    TextBox txt = (TextBox)GridView1.Rows[nRow].Cells[nCol].Controls[0];
                }
            }
}

1 个答案:

答案 0 :(得分:0)

看起来你没有在回发后创建GridView,并且“保存”按钮导致回发。您需要在每个页面加载时动态创建GridView。此外,我发现this documentation on the ASP.NET page lifecycle在很多场合都很有帮助。

在文档中,您将看到代码无法正常工作的稍微不直观的原因 - btnSave_Command在回发和Page_Load之后才会运行。