2010-05-10 62 views
2

我有一个问题,一直在困扰着我整天。c#计数器需要2个按钮点击才能更新

在我的代码,我有以下:

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

和按钮事件

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

然后在Page_Load中,我读了价值,并相应地创建控件。

我知道按钮事件触发后,Page_Load触发,所以值不会更新,直到下一个回发。真正的噩梦。

这里是整个代码:

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" /> 

由于提前,

马尔科

回答

1

好的我按照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; 
    } 
+0

这GetPostBackControl是一个聪明的主意。 – Venemo 2010-05-11 08:19:46

+0

注意:在这种情况下,这个实例等于this.Page实例。因此,你可以写“if(!IsPostBack)”或“GetPostBackControl(this)”。 (你的页面从页面类继承);) – Venemo 2010-05-11 08:21:31

+0

是啊,感谢上帝,我发现它解决了我所有的问题!感谢您的帮助,我为您付出了努力+1。马尔科 – Marko 2010-05-11 20:48:15

0

举动验证码:

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

要预渲染事件使表绑定到其数据按钮点击后发射。

+0

正如你所看到的,我在执行代码之前做了一系列检查。我已将整个代码块移至Page_PreRender事件,但tablePanel在submit_click上为空。 错误是: 指定的参数超出了有效值的范围。 resultsLabel.Text = Server.HtmlEncode(DataSetToStringXML(TableToDataSet((Table)tablePanel)。控制[0]))); – Marko 2010-05-10 05:42:29

+0

任何想法为什么在PreRender中创建控件而不是Page_Load时提交的值不存在? – Marko 2010-05-10 05:53:01

1

正如我在this other question中推荐的那样,如果您希望在按钮“Click”事件后执行一些页面逻辑,请将代码放入Page_PreRender

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

编辑:

更加紧密地检查你的代码后,我看到你添加的东西,创造新的控制,这是不是在PreRender事件是一个好主意。 而是将代码放入单独的方法中。在Page_Load中,检查它是否是回传,如果不是,则处理该情况。 在按钮的单击evnt中,还要添加对该新方法的调用。 (因此处理IsPostback ==真实案例)

+0

是的,但后来在我的submitButton_click事件中tablePanel是空的,因此抛出索引超出范围错误。 – Marko 2010-05-10 05:45:09

+0

这是一个真正的捕获22.我移动了在rowCount = rowCount + 1之后创建我的控件的方法;和colCount = colCount + 1;代码,但在尝试提交值时遇到了同样的问题。 – Marko 2010-05-10 05:51:53

+0

编辑我的答案,给你一个新的想法。 – Venemo 2010-05-10 06:19:59

相关问题