2011-06-06 97 views
0

我很难搞清楚如何改变一些使用javascript的输入值的值。你能看看我的代码,并告诉我为什么这不起作用吗?输入值不会改变使用javascript

这里是页的C#部分:

protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) { 
     String date = DateTime.Today.AddDays(1).ToString("yyyyMMdd"); 

     String myConnectionString = "Driver={Pervasive ODBC Client Interface};servername=192.168.1.2;[email protected];"; 
     String commandString = "valid SELECT statement"; 
     OdbcConnection myConnection = new OdbcConnection(); 
     myConnection.ConnectionString = myConnectionString; 
     OdbcDataReader reader2; 
     OdbcDataReader reader3; 
     OdbcCommand command = new OdbcCommand(commandString, myConnection); 

     try 
     { 
      myConnection.Open(); 
      OdbcDataReader reader = command.ExecuteReader(); 

      delList.Controls.Clear(); 

      Table tbl = new Table(); 
      tbl.ID = "tbl1"; 
      tbl.BorderWidth = 1; 
      delList.Controls.Add(tbl); 

      //add header row 
      String[] headers = { "id", "ticket#", "address", "city", "state", "zip", "start time", "end time", "total cube", "route" }; 
      TableHeaderRow th = new TableHeaderRow(); 
      TableCell tc; 
      for (int i = 0; i < headers.Length; i++) 
      { 
       tc = new TableCell(); 
       tc.BorderWidth = 1; 
       tc.Text = headers[i]; 
       th.Cells.Add(tc); 
      } 
      tbl.Rows.Add(th); 

      int fCount = reader.FieldCount; 
      int index = 1; 
      char[] rem = new char[2] { 'B', 'D' }; 

      HtmlInputHidden hidden1, hidden2, hidden3; 

      while (reader.Read()) 
      { 

       if(reader.GetValue(fCount -1).ToString()[0] == 'D') 
       { 

        TableRow tr = new TableRow(); 
        tc = new TableCell(); 
        tc.Text = index.ToString(); 
        tc.BorderWidth = 1; 
        tr.Cells.Add(tc); 
        //create hidden field 
        hidden1 = new HtmlInputHidden(); 
        hidden2 = new HtmlInputHidden(); 
        hidden1.ID = "tick" + index; 
        hidden2.ID = "rte" + index; 
        hidden1.Value = reader.GetValue(0).ToString(); 
        this.Controls.Add(hidden1); 
        for (int i = 0; i < fCount-1 ; i++) 
        { 
         tc = new TableCell(); 
         tc.Text = reader.GetValue(i).ToString(); 
         tc.BorderWidth = 1; 
         tr.Cells.Add(tc); 
        } 
        //get cube 
        String getItems = "SELECT so_dtl_item_id, so_dtl_qty_to_ship FROM so_dtl WHERE so_dtl_no='" + reader.GetValue(0) + "';"; 
        String getCubes = "SELECT item_cube FROM item WHERE item_id='"; 
        command = new OdbcCommand(getItems, myConnection); 
        reader2 = command.ExecuteReader(); 
        double cubes = 0; 
        while (reader2.Read()) 
        { 
         command = new OdbcCommand(getCubes + reader2.GetValue(0).ToString() + "';", myConnection); 
         reader3 = command.ExecuteReader(); 
         double tmp = 0; 
         while (reader3.Read()) 
         { 
          tmp = Convert.ToDouble(reader3.GetValue(0)); 
         } 
         cubes += tmp * Convert.ToDouble(reader2.GetValue(1)); 
         reader3.Close(); 
        }       
        reader2.Close(); 
        tc = new TableCell(); 
        tc.BorderWidth = 1; 
        tc.Attributes["name"] = "cubes"; 
        tc.Text = cubes.ToString(); 
        tr.Cells.Add(tc); 

        //get route 
        tc = new TableCell(); 
        tc.BorderWidth = 1; 
        String rteNum = reader.GetValue(fCount - 1).ToString().TrimStart(rem); 

        hidden2.Value = rteNum; 
        this.Controls.Add(hidden2); 

        tc.Text = "<input name=\"route\" id=\"route\" type=\"text\" value="+ rteNum +" onblur=\"refresh()\" />"; 
        tr.Cells.Add(tc); 

        tbl.Rows.Add(tr); 
        index++; 
       } 
      } 

      hidden3 = new HtmlInputHidden(); 
      hidden3.ID = "total"; 
      hidden3.Value = index.ToString(); 
      this.Controls.Add(hidden3); 

      reader.Close(); 
      command.Dispose(); 
      myConnection.Close(); 
     } 
     catch (OdbcException ex) 
     { 
      System.Diagnostics.Trace.WriteLine(ex.Message); 
     } 
     } 
    } 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void Button_Click(object sender, EventArgs e) 
    { 
     HtmlInputHidden hiddenControl = (HtmlInputHidden)FindControl("total"); 
     try 
     { 
      int total = Convert.ToInt32(hiddenControl.Value); 
      String ticket, route; 

      for (int i = 1; i < total; i++) 
      { 
       hiddenControl = (HtmlInputHidden)FindControl("tick" + i); 
       ticket = hiddenControl.Value; 

       hiddenControl = (HtmlInputHidden)FindControl("rte" + i); 
       route = hiddenControl.Value; 

       System.Diagnostics.Trace.WriteLine(ticket + ": " + route); 
      } 
     } 
     catch (FormatException ex) 
     { 
      Console.WriteLine("Input string is not a sequence of digits."); 
      System.Diagnostics.Trace.WriteLine(ex.Message); 
     } 
     catch (OverflowException ex) 
     { 
      Console.WriteLine("The number cannot fit in an Int32."); 
      System.Diagnostics.Trace.WriteLine(ex.Message); 
     } 
    } 

这里是更新值的JavaScript:

function update() { 
      var tbl = document.getElementById('MainContent_tbl1'); 
      var rows = tbl.getElementsByTagName('tr'); 
      var routes = document.getElementsByName("route"); 
      var mod; 
      //make call to c# func to have the database updated 
      for (var i = 1; i < rows.length; i++) { 
       mod = document.getElementById("rte" + i); 
       //for testing 
       if (i == 1 || i == 10) { 
        alert("rte" + i + ", " + mod.value); 
       } 
       //change value 
       mod.value = routes[i - 1].value; 
       //for testing 
       if (i == 1 || i == 10) { 
        alert("rte" + i + ", " + mod.value); 
       } 
     } 

警报显示正确的价值观,但价值观本身永远都不会在源代码中更改。所有的帮助将不胜感激,谢谢。

如果(!Page.IsPostBack)添加到page_init中,现在该值不会变回,但返回值为null可能发生的任何原因?

+0

是否确定在发生点击事件的HTTP POST之前发生了更新调用? – eulerfx 2011-06-06 19:16:02

+0

是的,我也尝试在单击按钮之前运行更新,但这并没有改变任何东西。 – user776530 2011-06-06 20:18:38

回答

0

那么当你在后面的代码中动态添加和设置值时,这是个问题。您需要为每次页面加载重新设置值。我不知道这个解决方案,但当情况需要时,我有解决这个问题的办法。

当你动态添加HTMLHiddenInput元素和您检查网页的源文件,它看起来像这样: -

<input name="ctl00$MainContent$Test" type="hidden" id="MainContent_Test" value="7" />

检查出了名,并隐藏字段的ID与所有的asp.net层次结构和所有。

现在在你的代码背后的按钮点击功能,你需要像这样读取它。

string sTest = Request.Form["ctl00$MainContent$Test"];

你要读取输入字段的名称参数。

并在javascript中设置值时。您可以使用此: -

document.getElementById("MainContent_Test").value = "5";

您可以使用输入字段的ID参数。此外,您需要将代码包装在PageLoad中的if(!IsPostBack)中,以便值不会重置,并且一旦完成了读取ButtonClick中的值,您将需要再次动态添加隐藏字段就像您在PageLoad中所做的一样。

这是一个肮脏的伎俩。希望它对你有用,而更好的解决方案将始终有帮助。

0

这个post将帮助您设置值。

+0

在javascript中我已经有.value小写字母,值会更改,然后在服务器访问它时恢复为旧值。 – user776530 2011-06-07 17:46:33