关于绑定到datagrid中的textbox控件添加onchange事件,总是提示未将对象引用设置到对象的实例错误

时间:2021-05-24 21:26:44
txtUnitAmount是一个绑定在datagrid中的textbox,我想把件数(txtUnitAmount)乘以一个数得出总数量:所以当我输入件数后,触发一个change事件,这样绑定在datagrid中同一行的另一个textbox(txtTotalAmount)根据我输入的值计算出来并显示
在服务器端如下:
//首先找出datagrid中的txtUnitAmount控件
private void dgBody_ItemCreated(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
try
{
if(e.Item.Cells[5].FindControl("txtUnitAmount")!= null)
{
int inttemp1=0;
TextBox txtUnitAmount=(TextBox)e.Item.Cells[5].FindControl("txtUnitAmount");
if (txtUnitAmount.Text.ToString()=="")
{
inttemp1=0;
}
else
{
inttemp1=Convert.ToInt32(txtUnitAmount.Text.ToString());
}
if(e.Item.Cells[0].FindControl("DropListPackage")!= null)
{
DropDownList DropListPackage=(DropDownList)e.Item.Cells[3].FindControl("DropListPackage");

int inttemp2=Convert.ToInt32(DropListPackage.SelectedItem.Value.ToString());
txtUnitAmount.Attributes.Add("onchange","Calculate(inttemp1,inttemp2)");
}
}
}
catch(Exception ex)
{
Response.Write(ex.ToString());
}
}

aspx中的javascript
<script language="javascript">
function Calculate(int intUnitAmount,int intInerAmount)
{
var totalAmount=intUnitAmount*intInerAmount;
PreInStock.txtTotalAmount.value=totalAmount;
}


</script>


其中页面上的控件如下:
<asp:TemplateColumn HeaderText="包装数量">
<ItemTemplate>
<asp:Repeater runat="server" DataSource='<%# ((DataRowView)Container.DataItem).Row.GetChildRows("Product_Package") %>'>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "[\"InterAmount\"]") %>
<%# DataBinder.Eval(Container.DataItem, "[\"AmountUnit\"]") %>
/<%# DataBinder.Eval(Container.DataItem, "[\"UnitName\"]") %><br>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="件数">
<ItemTemplate>
&nbsp;
<asp:TextBox id="txtUnitAmount" Width="35px" Text='<%# DataBinder.Eval(Container.DataItem, "UnitAmount") %>' runat=server AutoPostBack=True>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText="总数">
<ItemTemplate>
<INPUT style="WIDTH: 34px; HEIGHT: 21px" type=text size=1 value='<%# DataBinder.Eval(Container.DataItem, "TotalAmount") %>' runat="server" id="txtTotalAmount">
</ItemTemplate>
</asp:TemplateColumn>

10 个解决方案

#1


你是在什麼時候綁定的。確保是在edit狀態下才有textbox控件。

#2


To:ld_key(什么名字也想)

我在page_load中就绑定的,什么是edit状态下?应该再datagrid的什么事件中获取绑定到它的textbox控件的客户端id? 你看我用的是dgBody_ItemCreated事件,是不是不该再这个事件中写呀?

#3


应该有办法解决的亚,我现在用的是很苯的办法,就是每次输入件数后,把autopostback设置为true,然后提交到服务器端来通过计算,得出总数,在绑定显示,到能实现了,但是也太笨了,有谁可以帮我呀?

#4


我想了个方法,就是datagrid中加设编辑列,在另一个textbox的属性为onlyread=true,当用户在一个textbox输入件数单击编辑重的更新,在该事件中计算出数量,不用javasript不知道是否能满足你的需求否!!

#5


学习

#6


我是这样实现的,在datagrid绑定后插入一些脚本定义对textbox的前端onchange的处理.
js中写一个带参数的函数根据参数对相应的textbox的onchage事件进行处理.

.cs
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
Response.Write("<script for='AppGrid__ctl"+(i+3).ToString()+"_TextBox1' event='onchange'>TextBoxOnChange('"+(i+1).ToString()+"');</script>");
javascript:
function CheckBoxOnClick(i)
{
//alert(document.all.AppGrid.rows[i].cells[1].innerText);
var TextBoxID=eval("document.all."+"AppGrid__ctl"+(parseInt(i)+2)+"_TextBox1");
//TextBoxID.value=这里你自己处理吧
}
注:AppGrid__ctl"+(i+3).ToString()+"_TextBox1,是你的textBox clientid, 你的根据html源文件 看到

#7


不过用onkeypress事件会好一些,例
<input type=text onkeypress="javascript:if(event.keyCode==13){alert('a');return false;}">

#8


先up一下:)噢

#9


to Cnapollo(旁痞): 我按照你写的试了一下,不行呀,根本就不响应cs中加入的CheckBoxOnClick(i)事件,是不是cs写得不对呀?不过你这种实现方式倒是很好,但是为什么不行呢?好像cs中的Response.Write("<script for='AppGrid__ctl"+(i+3).ToString()+"_TextBox1' event='onchange'>TextBoxOnChange('"+(i+1).ToString()+"');</script>");

根本就没有加上它的change事件!
你试过吗?成功了吗?

#10


呵呵,是我搞错了,嘿嘿,不错不错,舒服舒服,我马上结贴给分,先谢谢诸位了!
to  Cnapollo(旁痞) :谢谢你呀!祝你早日升上星星亚!

#1


你是在什麼時候綁定的。確保是在edit狀態下才有textbox控件。

#2


To:ld_key(什么名字也想)

我在page_load中就绑定的,什么是edit状态下?应该再datagrid的什么事件中获取绑定到它的textbox控件的客户端id? 你看我用的是dgBody_ItemCreated事件,是不是不该再这个事件中写呀?

#3


应该有办法解决的亚,我现在用的是很苯的办法,就是每次输入件数后,把autopostback设置为true,然后提交到服务器端来通过计算,得出总数,在绑定显示,到能实现了,但是也太笨了,有谁可以帮我呀?

#4


我想了个方法,就是datagrid中加设编辑列,在另一个textbox的属性为onlyread=true,当用户在一个textbox输入件数单击编辑重的更新,在该事件中计算出数量,不用javasript不知道是否能满足你的需求否!!

#5


学习

#6


我是这样实现的,在datagrid绑定后插入一些脚本定义对textbox的前端onchange的处理.
js中写一个带参数的函数根据参数对相应的textbox的onchage事件进行处理.

.cs
for(int i=0;i<ds.Tables[0].Rows.Count;i++)
Response.Write("<script for='AppGrid__ctl"+(i+3).ToString()+"_TextBox1' event='onchange'>TextBoxOnChange('"+(i+1).ToString()+"');</script>");
javascript:
function CheckBoxOnClick(i)
{
//alert(document.all.AppGrid.rows[i].cells[1].innerText);
var TextBoxID=eval("document.all."+"AppGrid__ctl"+(parseInt(i)+2)+"_TextBox1");
//TextBoxID.value=这里你自己处理吧
}
注:AppGrid__ctl"+(i+3).ToString()+"_TextBox1,是你的textBox clientid, 你的根据html源文件 看到

#7


不过用onkeypress事件会好一些,例
<input type=text onkeypress="javascript:if(event.keyCode==13){alert('a');return false;}">

#8


先up一下:)噢

#9


to Cnapollo(旁痞): 我按照你写的试了一下,不行呀,根本就不响应cs中加入的CheckBoxOnClick(i)事件,是不是cs写得不对呀?不过你这种实现方式倒是很好,但是为什么不行呢?好像cs中的Response.Write("<script for='AppGrid__ctl"+(i+3).ToString()+"_TextBox1' event='onchange'>TextBoxOnChange('"+(i+1).ToString()+"');</script>");

根本就没有加上它的change事件!
你试过吗?成功了吗?

#10


呵呵,是我搞错了,嘿嘿,不错不错,舒服舒服,我马上结贴给分,先谢谢诸位了!
to  Cnapollo(旁痞) :谢谢你呀!祝你早日升上星星亚!