我很难弄清楚如何使用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可能发生的任何原因?
答案 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中所做的一样。
这是一个肮脏的把戏。希望它对你有用,更好的解决方案永远都会有所帮助。