代码之家  ›  专栏  ›  技术社区  ›  Marko

C计数器需要单击2个按钮才能更新

  •  2
  • Marko  · 技术社区  · 15 年前

    我有一个问题整天困扰着我。

    在我的代码中,我有以下内容:

    private int rowCount
        {
            get { return (int)ViewState["rowCount"]; }
            set { ViewState["rowCount"] = value; }
        }
    

    还有一个按钮事件

    protected void addRow_Click(object sender, EventArgs e)
        {
            rowCount = rowCount + 1;
        }
    

    然后在页面“加载”中,我读取该值并相应地创建控件。

    我理解按钮事件在页面加载激发后激发,因此在下一次回发之前不会更新该值。真正的噩梦。

    以下是整个代码:

    protected void Page_Load(object sender, EventArgs e)
        {
            string xmlValue = ""; //To read a value from a database
            if (xmlValue.Length > 0)
            {
                if (!Page.IsPostBack)
                {
                    DataSet ds = XMLToDataSet(xmlValue);
                    Table dimensionsTable = DataSetToTable(ds);
                    tablePanel.Controls.Add(dimensionsTable);
    
                    DataTable dt = ds.Tables["Dimensions"];
                    rowCount = dt.Rows.Count;
                    colCount = dt.Columns.Count;
                }
                else
                {
                    tablePanel.Controls.Add(DataSetToTable(DefaultDataSet(rowCount, colCount)));
                }
            }
            else
            {
                if (!Page.IsPostBack)
                {
                    rowCount = 2;
                    colCount = 4;
                }
                tablePanel.Controls.Add(DataSetToTable(DefaultDataSet(rowCount, colCount)));
            }
        }
    
        protected void submit_Click(object sender, EventArgs e)
        {
            resultsLabel.Text = Server.HtmlEncode(DataSetToStringXML(TableToDataSet((Table)tablePanel.Controls[0])));
        }
        protected void addColumn_Click(object sender, EventArgs e)
        {
            colCount = colCount + 1;
        }
    
        protected void addRow_Click(object sender, EventArgs e)
        {
            rowCount = rowCount + 1;
        }
    
        public DataSet TableToDataSet(Table table)
        {
            DataSet ds = new DataSet();
    
            DataTable dt = new DataTable("Dimensions");
            ds.Tables.Add(dt);
    
            //Add headers
            for (int i = 0; i < table.Rows[0].Cells.Count; i++)
            {
                DataColumn col = new DataColumn();
                TextBox headerTxtBox = (TextBox)table.Rows[0].Cells[i].Controls[0];
    
                col.ColumnName = headerTxtBox.Text;
                col.Caption = headerTxtBox.Text;
                dt.Columns.Add(col);
            }
    
    
            for (int i = 0; i < table.Rows.Count; i++)
            {
                DataRow valueRow = dt.NewRow();
                for (int x = 0; x < table.Rows[i].Cells.Count; x++)
                {
                    TextBox valueTextBox = (TextBox)table.Rows[i].Cells[x].Controls[0];
                    valueRow[x] = valueTextBox.Text;
                }
                dt.Rows.Add(valueRow);
            }
    
            return ds;
        }
    
        public Table DataSetToTable(DataSet ds)
        {
            DataTable dt = ds.Tables["Dimensions"];
            Table newTable = new Table();
    
            //Add headers
            TableRow headerRow = new TableRow();
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                TableCell headerCell = new TableCell();
                TextBox headerTxtBox = new TextBox();
                headerTxtBox.ID = "HeadersTxtBox" + i.ToString();
                headerTxtBox.Font.Bold = true;
                headerTxtBox.Text = dt.Columns[i].ColumnName;
    
                headerCell.Controls.Add(headerTxtBox);
                headerRow.Cells.Add(headerCell);
            }
            newTable.Rows.Add(headerRow);
    
            //Add value rows
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TableRow valueRow = new TableRow();
                for (int x = 0; x < dt.Columns.Count; x++)
                {
                    TableCell valueCell = new TableCell();
                    TextBox valueTxtBox = new TextBox();
                    valueTxtBox.ID = "ValueTxtBox" + i.ToString() + i + x + x.ToString();
                    valueTxtBox.Text = dt.Rows[i][x].ToString();
    
                    valueCell.Controls.Add(valueTxtBox);
                    valueRow.Cells.Add(valueCell);
                }
                newTable.Rows.Add(valueRow);
            }
    
            return newTable;
        }
    
        public DataSet DefaultDataSet(int rows, int cols)
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable("Dimensions");
            ds.Tables.Add(dt);
    
    
            DataColumn nameCol = new DataColumn();
            nameCol.Caption = "Name";
            nameCol.ColumnName = "Name";
            nameCol.DataType = System.Type.GetType("System.String");
            dt.Columns.Add(nameCol);
    
            DataColumn widthCol = new DataColumn();
            widthCol.Caption = "Width";
            widthCol.ColumnName = "Width";
            widthCol.DataType = System.Type.GetType("System.String");
            dt.Columns.Add(widthCol);
    
            if (cols > 2)
            {
                DataColumn heightCol = new DataColumn();
                heightCol.Caption = "Height";
                heightCol.ColumnName = "Height";
                heightCol.DataType = System.Type.GetType("System.String");
                dt.Columns.Add(heightCol);
            }
            if (cols > 3)
            {
                DataColumn depthCol = new DataColumn();
                depthCol.Caption = "Depth";
                depthCol.ColumnName = "Depth";
                depthCol.DataType = System.Type.GetType("System.String");
                dt.Columns.Add(depthCol);
            }
            if (cols > 4)
            {
                int newColCount = cols - 4;
                for (int i = 0; i < newColCount; i++)
                {
                    DataColumn newCol = new DataColumn();
                    newCol.Caption = "New " + i.ToString();
                    newCol.ColumnName = "New " + i.ToString();
                    newCol.DataType = System.Type.GetType("System.String");
                    dt.Columns.Add(newCol);
                }
            }
    
            for (int i = 0; i < rows; i++)
            {
                DataRow newRow = dt.NewRow();
                newRow["Name"] = "Name " + i.ToString();
                newRow["Width"] = "Width " + i.ToString();
                if (cols > 2)
                {
                    newRow["Height"] = "Height " + i.ToString();
                }
                if (cols > 3)
                {
                    newRow["Depth"] = "Depth " + i.ToString();
                }
                dt.Rows.Add(newRow);
            }
            return ds;
        }
    
        public DataSet XMLToDataSet(string xml)
        {
            StringReader sr = new StringReader(xml);
            DataSet ds = new DataSet();
            ds.ReadXml(sr);
    
            return ds;
        }
    
        public string DataSetToStringXML(DataSet ds)
        {
            XmlDocument _XMLDoc = new XmlDocument();
            _XMLDoc.LoadXml(ds.GetXml());
    
            StringWriter sw = new StringWriter();
            XmlTextWriter xw = new XmlTextWriter(sw);
    
            XmlDocument xml = _XMLDoc;
            xml.WriteTo(xw);
            return sw.ToString();
        }
    
        private int rowCount
        {
            get { return (int)ViewState["rowCount"]; }
            set { ViewState["rowCount"] = value; }
        }
        private int colCount
        {
            get { return (int)ViewState["colCount"]; }
            set { ViewState["colCount"] = value; }
        }
    

    编辑:这也是我的.aspx,以防你想在vs.

        <asp:Panel ID="tablePanel" runat="server" CssClass="table-panel" />
        <asp:Label ID="resultsLabel" runat="server" />
        <asp:LinkButton ID="submit" Text="submit" runat="server" onclick="submit_Click" />
        <asp:LinkButton ID="addColumn" Text="Add Column" runat="server" 
            onclick="addColumn_Click" />
        <asp:LinkButton ID="addRow" Text="Add Row" runat="server" onclick="addRow_Click" />
    

    事先谢谢,

    马尔科

    3 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    正如我在 this other question ,如果希望在按钮后执行某些页逻辑, Click 事件,将该代码放入 Page_PreRender 相反。

    您可以在这里阅读更多信息: ASP.NET page life cycle .

    编辑:

    在更仔细地检查了代码之后,我发现您添加了一些东西并创建了新的控件,这在prerender事件中不是一个好主意。 相反,将代码放入单独的方法中。在页面加载中,检查它是否是回发,如果不是回发,则处理该案例。 在按钮的click evnt中,也添加对新方法的调用。(因此处理ispostback==true)

        2
  •  1
  •   Marko    15 年前

    好的,我已经按照中的说明解决了这个问题。 this 邮政。

    这是我的最后一个代码-如果您需要创建基于计数器的动态控件,请随意使用它。

    另外,我也不介意对整个编码风格的反馈,我总是喜欢别人的输入。

    protected void Page_Load(object sender, EventArgs e)
        {
            string xmlValue = ""; //To read a value from a database
            if (xmlValue.Length > 0)
            {
                if (!Page.IsPostBack)
                {
                    DataSet ds = XMLToDataSet(xmlValue);
                    Table dimensionsTable = DataSetToTable(ds);
                    tablePanel.Controls.Add(dimensionsTable);
    
                    DataTable dt = ds.Tables["Dimensions"];
                    rowCount = dt.Rows.Count;
                    colCount = dt.Columns.Count;
                }
                else
                {
                    tablePanel.Controls.Add(DataSetToTable(DefaultDataSet(rowCount, colCount)));
                }
            }
            else
            {
                if (!Page.IsPostBack)
                {
                    rowCount = 2;
                    colCount = 4;
                }
                else
                {
                    if (GetPostBackControl(this.Page).ID == "addRow")
                    {
                        rowCount = rowCount + 1;
                    }
                    else if (GetPostBackControl(this.Page).ID == "addColumn")
                    {
                        colCount = colCount + 1;
                    }
                }
                tablePanel.Controls.Add(DataSetToTable(DefaultDataSet(rowCount, colCount)));
            }
        }
    
        protected void submit_Click(object sender, EventArgs e)
        {
            resultsLabel.Text = Server.HtmlEncode(DataSetToStringXML(TableToDataSet((Table)tablePanel.Controls[0])));
        }
        protected void addColumn_Click(object sender, EventArgs e)
        {
    
        }
    
        protected void addRow_Click(object sender, EventArgs e)
        {
    
        }
    
        public DataSet TableToDataSet(Table table)
        {
            DataSet ds = new DataSet();
    
            DataTable dt = new DataTable("Dimensions");
            ds.Tables.Add(dt);
    
            //Add headers
            for (int i = 0; i < table.Rows[0].Cells.Count; i++)
            {
                DataColumn col = new DataColumn();
                TextBox headerTxtBox = (TextBox)table.Rows[0].Cells[i].Controls[0];
    
                col.ColumnName = headerTxtBox.Text;
                col.Caption = headerTxtBox.Text;
                dt.Columns.Add(col);
            }
    
    
            for (int i = 0; i < table.Rows.Count; i++)
            {
                DataRow valueRow = dt.NewRow();
                for (int x = 0; x < table.Rows[i].Cells.Count; x++)
                {
                    TextBox valueTextBox = (TextBox)table.Rows[i].Cells[x].Controls[0];
                    valueRow[x] = valueTextBox.Text;
                }
                dt.Rows.Add(valueRow);
            }
    
            return ds;
        }
    
        public Table DataSetToTable(DataSet ds)
        {
            DataTable dt = ds.Tables["Dimensions"];
            Table newTable = new Table();
    
            //Add headers
            TableRow headerRow = new TableRow();
            for (int i = 0; i < dt.Columns.Count; i++)
            {
                TableCell headerCell = new TableCell();
                TextBox headerTxtBox = new TextBox();
                headerTxtBox.ID = "HeadersTxtBox" + i.ToString();
                headerTxtBox.Font.Bold = true;
                headerTxtBox.Text = dt.Columns[i].ColumnName;
    
                headerCell.Controls.Add(headerTxtBox);
                headerRow.Cells.Add(headerCell);
            }
            newTable.Rows.Add(headerRow);
    
            //Add value rows
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                TableRow valueRow = new TableRow();
                for (int x = 0; x < dt.Columns.Count; x++)
                {
                    TableCell valueCell = new TableCell();
                    TextBox valueTxtBox = new TextBox();
                    valueTxtBox.ID = "ValueTxtBox" + i.ToString() + i + x + x.ToString();
                    valueTxtBox.Text = dt.Rows[i][x].ToString();
    
                    valueCell.Controls.Add(valueTxtBox);
                    valueRow.Cells.Add(valueCell);
                }
                newTable.Rows.Add(valueRow);
            }
    
            return newTable;
        }
    
        public DataSet DefaultDataSet(int rows, int cols)
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable("Dimensions");
            ds.Tables.Add(dt);
    
    
            DataColumn nameCol = new DataColumn();
            nameCol.Caption = "Name";
            nameCol.ColumnName = "Name";
            nameCol.DataType = System.Type.GetType("System.String");
            dt.Columns.Add(nameCol);
    
            DataColumn widthCol = new DataColumn();
            widthCol.Caption = "Width";
            widthCol.ColumnName = "Width";
            widthCol.DataType = System.Type.GetType("System.String");
            dt.Columns.Add(widthCol);
    
            if (cols > 2)
            {
                DataColumn heightCol = new DataColumn();
                heightCol.Caption = "Height";
                heightCol.ColumnName = "Height";
                heightCol.DataType = System.Type.GetType("System.String");
                dt.Columns.Add(heightCol);
            }
            if (cols > 3)
            {
                DataColumn depthCol = new DataColumn();
                depthCol.Caption = "Depth";
                depthCol.ColumnName = "Depth";
                depthCol.DataType = System.Type.GetType("System.String");
                dt.Columns.Add(depthCol);
            }
            if (cols > 4)
            {
                int newColCount = cols - 4;
                for (int i = 0; i < newColCount; i++)
                {
                    DataColumn newCol = new DataColumn();
                    newCol.Caption = "New " + i.ToString();
                    newCol.ColumnName = "New " + i.ToString();
                    newCol.DataType = System.Type.GetType("System.String");
                    dt.Columns.Add(newCol);
                }
            }
    
            for (int i = 0; i < rows; i++)
            {
                DataRow newRow = dt.NewRow();
                newRow["Name"] = "Name " + i.ToString();
                newRow["Width"] = "Width " + i.ToString();
                if (cols > 2)
                {
                    newRow["Height"] = "Height " + i.ToString();
                }
                if (cols > 3)
                {
                    newRow["Depth"] = "Depth " + i.ToString();
                }
                dt.Rows.Add(newRow);
            }
            return ds;
        }
    
        public DataSet XMLToDataSet(string xml)
        {
            StringReader sr = new StringReader(xml);
            DataSet ds = new DataSet();
            ds.ReadXml(sr);
    
            return ds;
        }
    
        public string DataSetToStringXML(DataSet ds)
        {
            XmlDocument _XMLDoc = new XmlDocument();
            _XMLDoc.LoadXml(ds.GetXml());
    
            StringWriter sw = new StringWriter();
            XmlTextWriter xw = new XmlTextWriter(sw);
    
            XmlDocument xml = _XMLDoc;
            xml.WriteTo(xw);
            return sw.ToString();
        }
    
        private int rowCount
        {
            get { return (int)ViewState["rowCount"]; }
            set { ViewState["rowCount"] = value; }
        }
        private int colCount
        {
            get { return (int)ViewState["colCount"]; }
            set { ViewState["colCount"] = value; }
        }
        public static Control GetPostBackControl(Page page)
        {
            Control control = null;
    
            string ctrlname = page.Request.Params.Get("__EVENTTARGET");
            if (ctrlname != null && ctrlname != string.Empty)
            {
                control = page.FindControl(ctrlname);
            }
            else
            {
                foreach (string ctl in page.Request.Form)
                {
                    Control c = page.FindControl(ctl);
                    if (c is System.Web.UI.WebControls.Button)
                    {
                        control = c;
                        break;
                    }
                }
            }
            return control;
        }
    
        3
  •  0
  •   Roger Johansson    15 年前

    移动此代码:

    tablePanel.Controls.Add(DataSetToTable(DefaultDataSet(rowCount, colC....
    

    到prerender事件,以便在单击“激发”按钮后使表绑定到其数据。