输入值不会使用javascript更改

时间:2011-06-06 18:50:41

标签: c# javascript asp.net

我很难弄清楚如何使用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;dbq=@dbname;";
        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);
                }
         }

警报显示正确的值,但值本身永远不会在源中更改。非常感谢所有帮助,谢谢。

我将if(!Page.IsPostBack)添加到page_init所以现在该值不会更改回来但是它返回null可能发生的任何原因?

2 个答案:

答案 0 :(得分:0)

post可帮助您设置值。

答案 1 :(得分:0)

当您在后面的代码中动态添加和设置值时,这就是问题所在。您需要为每个页面加载再次设置值。我不知道这方面的解决方案,但是当情况需要时,我已经解决了这个问题。

当您动态添加HTMLHiddenInput元素并检查页面源时,它看起来像这样: -

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

使用所有asp.net heirarchy和所有。

查看隐藏字段的名称和ID

现在,在按钮点击功能的代码中,您需要像这样阅读它。

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

您必须阅读输入字段的name参数。

在javascript中设置值时。你用这个: -

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

您使用输入字段的id参数。

此外,您需要将代码包装在PageLoad中的if(!IsPostBack)中,以便不重置值,一旦完成读取ButtonClick中的值,您将再次需要动态添加隐藏字段就像你在PageLoad中所做的一样。

这是一个肮脏的把戏。希望它对你有用,更好的解决方案永远都会有所帮助。