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

轻舟已过万重山 2004-06-17 11:37:21
具体功能:
有个做利润计算的DataGrid控件,读出了很多条记录,现在需要点修改后,能同时修改每一行中的"buy price","discount","sell price","margin",而这些数据按一定的公式相互关系,到整个页面上的数据满意了,再提交一次.
现在做到:
一行是不存在问题的,也可以在客户端做计算.改变某个文本的值后,其他的会自动计算出来,但修改了这行后要update保存它的值才能修改下一行,如果有100条记录,用户要update100次,不能满足要求.
说明下:这个问题搞不定,软件就失败了,大家有什么高见,请不吝赐教,分不够再加.
...全文
313 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
再看看吧
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
  • 打赏
  • 举报
回复
感谢先!有思路就好!
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
  • 打赏
  • 举报
回复
TO:dayasky(生活不容易啊)
能做到点击编辑后所有的行处于编辑状态,然后修改某行中某个值,其他的都跟着变化吗?
另外还要个问题,按某个字段分组.你有空可以看看我的demo.谢谢!
  • 打赏
  • 举报
回复
TO:ssm1226(雨中人*www.dncc.net*)
客户端肯定是用js来做计算,但是如何同时编辑这些数据,然后相互之间按一定的关系得到结果?
  • 打赏
  • 举报
回复
看来方法不错,有没有代码研究一下!谢谢!
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!
  • 打赏
  • 举报
回复
自己再顶一下,有高见的朋友继续!
jintaogentle 2004-06-17
  • 打赏
  • 举报
回复
hao,留着看看
ShengNet 2004-06-17
  • 打赏
  • 举报
回复
能做到点击编辑后所有的行处于编辑状态

怎么实现
加载更多回复(4)

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧