0

実行時に動的にビルドされたグリッドビューをデータテーブルにバインドし、グリッドビューの外部に配置されたグリッドビューデータを保存するボタンを持っています

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();
            }
        }  
    }

だから私はテキストボックスのすべてが一度に編集できるグリッドビューを持っています 問題は、「グリッドビューの外にある」保存ボタンをクリックすると、すべてのテキストボックスがなくなってしまうことです

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];
                }
            }
}
4

1 に答える 1

0

ポストバック後に GridView を作成していないようで、[保存] ボタンが原因でポストバックが発生しています。ページの読み込みごとに GridView を動的に作成する必要があります。また、 ASP.NET ページのライフサイクルに関するこのドキュメントは、さまざまな場面で役立つことがわかりました。

ドキュメンテーションでは、コードが思い通りに動作しない理由が少し直感的ではないことがわかります - btnSave_Command は、ポストバックと Page_Load の後まで実行されません。

于 2012-12-08T15:24:26.307 に答える