• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

困了几个月,感觉超级难,在客户端按一定的公式计算DataGrid各单元格的值

轻舟已过万重山 2004-06-17 11:37:21
具体功能:
有个做利润计算的DataGrid控件,读出了很多条记录,现在需要点修改后,能同时修改每一行中的"buy price","discount","sell price","margin",而这些数据按一定的公式相互关系,到整个页面上的数据满意了,再提交一次.
现在做到:
一行是不存在问题的,也可以在客户端做计算.改变某个文本的值后,其他的会自动计算出来,但修改了这行后要update保存它的值才能修改下一行,如果有100条记录,用户要update100次,不能满足要求.
说明下:这个问题搞不定,软件就失败了,大家有什么高见,请不吝赐教,分不够再加.
...全文
277 点赞 收藏 24
写回复
24 条回复
轻舟已过万重山 2004年07月09日
再看看吧
private void dgmargin_ItemDataBound(object sender, C1ItemEventArgs e)
{
(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
{
TextBox textbox1=(TextBox)e.Item.FindControl("TextBox1");
TextBox textbox2=(TextBox)e.Item.FindControl("TextBox2");
TextBox textbox3=(TextBox)e.Item.FindControl("TextBox3");
TextBox textbox4=(TextBox)e.Item.FindControl("TextBox4");
TextBox textbox5=(TextBox)e.Item.FindControl("TextBox5");
TextBox textbox6=(TextBox)e.Item.FindControl("TextBox6");
if(textbox1!=null&&textbox2!=null&&textbox3!=null&&textbox4!=null&&textbox5!=null&&textbox6!=null)
{
string tb1=e.Item.UniqueID+"_"+"TextBox1";
tb1=tb1.Replace(":","_");
string tb2=e.Item.UniqueID+"_"+"TextBox2";
tb2=tb2.Replace(":","_");
string tb3=e.Item.UniqueID+"_"+"TextBox3";
tb3=tb3.Replace(":","_");
string tb4=e.Item.UniqueID+"_"+"TextBox4";
tb4=tb4.Replace(":","_");
string tb5=e.Item.UniqueID+"_"+"TextBox5";
tb5=tb5.Replace(":","_");
string tb6=e.Item.UniqueID+"_"+"TextBox6";
tb6=tb6.Replace(":","_");
string script1="<script language='javascript'>";
script1+="function function_"+tb1+"(){";
script1+="var form=document.Form1;";
script1+="var sellprice=form."+tb3+".value;";
script1+="var qty=form."+tb1+".value;";
script1+="document.Form1."+tb4+".value=sellprice*qty;";
script1+="}</script>";
Page.RegisterStartupScript(tb1,script1);
((TextBox)e.Item.FindControl("TextBox1")).Attributes.Add("onkeyup","function_"+tb1+"()");
}
}
}
这段东西产生了预料中的客户端,其中一段:
<input name="dgmargin:R0:Textbox1" type="text" value="4" id="dgmargin_R0_Textbox1" class="textbox" onkeyup="function_dgmargin_R0_TextBox1()" style="width:50px;" />

<script language='javascript'>function function_dgmargin_R0_TextBox1(){var form=document.Form1;var sellprice=form.dgmargin_R0_TextBox3.value;var qty=form.dgmargin_R0_TextBox1.value;document.Form1.dgmargin_R0_TextBox4.value=sellprice*qty;}</script>

但触发dgmargin_R0_Textbox1的onkeyup事件总是提示说dgmargin_R0_Textbox1.value为空或不室对象,为何?谢谢
回复 点赞
xueqs 2004年06月17日
mark
回复 点赞
dayasky 2004年06月17日
txtbcje是我的模板列中控件的ID
最后的bcje就成了前台这个控件每行的ID
回复 点赞
dayasky 2004年06月17日
对了,你的鼠标变手形的脚本好像有错:缺少对象

回复 点赞
dayasky 2004年06月17日
看我下面的代码,就是用uniqueid绑定js事件的
这样就可用bcje这个用uniqueid处理过的id区别前台显示时候同一控件在每行的不同id
从而能被script处理
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if(e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
TextBox txt=(TextBox) e.Item.FindControl("txtbcje");
if ( txt!=null)
{
//several onchange Js
string bcje = e.Item.UniqueID + "_"+"txtbcje";
bcje = bcje.Replace(":","_");
((TextBox)e.Item.FindControl("txtbcje")).Attributes.Add("onkeyup","calcje(bcje);");
}
}
}
回复 点赞
stoway 2004年06月17日
http://community.csdn.net/Expert/topic/3096/3096868.xml?temp=.846203
回复 点赞
轻舟已过万重山 2004年06月17日
感谢先!有思路就好!
回复 点赞
wxlada 2004年06月17日
临时手写的代码,没有经过调试!思路是可以达到要求的。
回复 点赞
wxlada 2004年06月17日
用一个hidden框保存要修改的行的数量,初始值为0,把点某行的修改,hidden框的值+1,再把此行的浏览状态变为可编辑的状态,每行都是一个text框赋上初始值,然后把此行所有控件的ID加上数字标识.例:
<input type="hidden" id="EditNum">
<table>
<repeat id="myrepeat" Runat="server">
<ItemTemplate>
<tr>
<td id="t0<%#DataBinder.Eval(Container.DataItem, "ID")%>">要显示的值</td>
<td><a onclick="editRow('<%#DataBinder.Eval(Container.DataItem, "ID")%>">','要显示的值')">修改</a></td>
<tr>
</ItemTemplate>
</repeat>
</table>

js:
function editRow(m,n)
{
var aa = parseInt(document.all("EditNum").value);
aa++;
document.all("t0"+m).innerHTML="<input type='text' id='a1"+aa+"' value='"+n+"'>";
}

然后你提交修改的时候,先获取hidden里的数,如果是3的话,就代表有三行被修改,然后用循环
for(int i=0;i<取到的行数;i++)
{
string _abc = Request.Form["a1"+i.tostring()];
保存到数据库
}

重点就是hidden 框中的数字,点修改要+1,如果恢复不修改某行,一定要-1
回复 点赞
轻舟已过万重山 2004年06月17日
TO:dayasky(生活不容易啊)
能做到点击编辑后所有的行处于编辑状态,然后修改某行中某个值,其他的都跟着变化吗?
另外还要个问题,按某个字段分组.你有空可以看看我的demo.谢谢!
回复 点赞
轻舟已过万重山 2004年06月17日
TO:ssm1226(雨中人*www.dncc.net*)
客户端肯定是用js来做计算,但是如何同时编辑这些数据,然后相互之间按一定的关系得到结果?
回复 点赞
轻舟已过万重山 2004年06月17日
看来方法不错,有没有代码研究一下!谢谢!
回复 点赞
ssm1226 2004年06月17日
在客户端用js处理,修改一行后,将修改后的数据临时存入一个hidden里
回复 点赞
dayasky 2004年06月17日
在itemdatabound事件中为每行的textbox控件绑定js事件
关键要用到uniqueid这个东西
回复 点赞
dayasky 2004年06月17日
这个问题不难,就是复杂点
用viewstate或session缓存你的dataset
多行同时编辑用js实现多行联动
比如价钱变了后比例、总数等也要变,当然是用js不提交变化快
要不老闪客户会烦的

我实现它用了一天半,加上查msdn学js的时间
回复 点赞
dayasky 2004年06月17日
楼上的兄弟,有这个必要吗?其实是俺不会写控件
js有for in
vbs有for each
都能循环了
用C#循环就更简单了
回复 点赞
kjsc 2004年06月17日
建议你这种复杂问题不要用DATAGRID,写个控价比较好,用checkboxlist或者hidden保存id 的值,提交后循环textbox!
回复 点赞
轻舟已过万重山 2004年06月17日
自己再顶一下,有高见的朋友继续!
回复 点赞
jintaogentle 2004年06月17日
hao,留着看看
回复 点赞
ShengNet 2004年06月17日
能做到点击编辑后所有的行处于编辑状态

怎么实现
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告