ASPX页面DataGrid控件中的数据保存时后台获取不到待保存数据对应的输入值,求指教

枕戈待旦勇往直前 2017-01-16 04:07:13
描述如下:
DataGrid控件绑定故障类型门限值是在page_load事件中但是在(!IsPostBack)外,现在用户要求页面展示”故障类型门限值“时分A、B两种情况并且可以分别保存两种情况的门限值。所以我将 DataGrid控件绑定放在(!IsPostBack)中,目的是为保证当加载B情况的门限值后修改相应值保存时不至于再执行一次Page_Load中的绑定A的故障值。现在问题就出在保存默认值时取不到故障名称对应的TextBox中的值,请问这是什么原因?
备注:
A ”非重保期门限“ B ”重保期门限 “

页面如图:

我修改红线框中”静帧“的持续时间值为”30“,但是在保存时获取到对应的主键是676是正确的,但”持续时间“Duration值为null
这两条数据区别在于有一个字段isImportant 为0或1 其中0代表”重保期“ 1代表”非重保期“
数据库的表如下图:



备注:如果把DataGrid控件绑定故障类型门限值是在page_load事件中但是在(!IsPostBack)外的话保存A情况的默认值是正常的,但保存B情况的默认值时可以拿到故障名称对应输入的值如30,但是保存时获取该故障名称的ID时总是A种情况该故障对应的NID的值。

...全文
550 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 14 楼 starfd 的回复:
难道是你禁用了viewstate?
问题解决了版主谢谢。 解决方法是DataGrid还是在IsPostBack外面绑定,但是在Page_Load方法里增加了判断加载B情况按钮是否被点击过,点击过则加载B,没点击过就加载A,这种情况就可以取到故障名称对应的主键及页面上的值了。 非常感谢版主亲自出来解惑,结分结贴。 PS:附上解决问题参考的帖子供有同类型问题的朋友参考: https://zhidao.baidu.com/question/406743322.html
  • 打赏
  • 举报
回复
引用 14 楼 starfd 的回复:
难道是你禁用了viewstate?
我看了DataGrid的属性”EnableViewState“是true的。 现在奇怪的就是在我点击"保存B的默认值时"获取不到页面上输入的值。
  • 打赏
  • 举报
回复
难道是你禁用了viewstate?
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
你执行保存的事件是什么,是不是事件不对,导致TextBox的值在其生命周期内还没到值还原的步骤
保存时先执行Page_Load方法时不再执行绑定DataGrid的方法了,因为它放到了(!IsPostBack)中。 如果在(!IsPostBack)外再执行绑定DataGrid的方法是可以获取到页面的输入值的。但是我加载了B种情况的默认值,保存时如果Page_Load方法中默认绑定的是A情况的DataGrid则拿到页面故障的输入值对应表中的故障的主键是A种情况的主键,所以需要把绑定DataGrid方法放到(!IsPostBack)中,这样加载了B种情况的默认值时(加载方法中绑定B对应数据的DataGrid),保存时拿到的主键是B故障的,但是获取到页面的输入值都是null 不知道我表述清楚没有? 版主
  • 打赏
  • 举报
回复
<span style="color: #FF0000;"> </span> 这句不是代码,是我想标红的,结果显示到代码中了
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
你执行保存的事件是什么,是不是事件不对,导致TextBox的值在其生命周期内还没到值还原的步骤
保存的方法如下,只用看红色部分的方法GetErrorTypeSet()它是取值时没有取到:

protected void SetAsDefault_Click(object sender, EventArgs e)
        {
            ErrorType et = new ErrorType();
            string isImportant = "0"; //非重保期
            ResultInfo rst = et.SaveAlarmThresholdDefaultSet(GetErrorTypeSet(),isImportant);
            if (rst.Success)
            {
                ScriptManager.RegisterClientScriptBlock(Page, this.GetType(), "alt", "alert('保存非重保期默认值成功!');", true);
            }
            else
            {
                ScriptManager.RegisterClientScriptBlock(Page, this.GetType(), "alt", "alert('保存非重保期默认值失败!" + rst.Message + "');", true);
            }
        }
GetErrorTypeSet() 方法如下:

private List<string[]> GetErrorTypeSet()
        {
            TextBox txtthreshold = null;
            DropDownList ddlChannel = null;
            string channelvalue = null;
            List<string[]> ErrorTypeList = new List<string[]>();
            for (int i = 0; i < this.grdErrorTypeClass.Items.Count; i++) //父DataGrid
            {
                DataGrid grdErrorType = ((DataGrid)grdErrorTypeClass.Items[i].FindControl("grdErrorType"));//子DataGrid

                for (int j = 0; j < grdErrorType.Items.Count; j++)
                {
                  
                    if (grdErrorType.Items[j].Cells[0].Text != "-1")
                    {
                        string[] paraArray = new string[9];
                        //paraArray最后一个为Nid,第一个为NETID
                        paraArray[0] = grdErrorType.Items[j].Cells[10].Text;     // NETID
                        paraArray[8] = grdErrorType.Items[j].Cells[0].Text;    // NID
                        paraArray[1] = grdErrorType.Items[j].Cells[8].Text;
                       txtthreshold = (TextBox)grdErrorType.Items[j].FindControl("Duration");  //本句就是取页面中”持续时间TextBox“的值
                        if (txtthreshold != null)   //但总是为null
                        {
                            paraArray[4] = txtthreshold.Text;
                        }
                      ......
 }
谢谢版主
  • 打赏
  • 举报
回复
你执行保存的事件是什么,是不是事件不对,导致TextBox的值在其生命周期内还没到值还原的步骤
  • 打赏
  • 举报
回复
引用 3 楼 starfd 的回复:
Item[j].Cells[0].FindControl
现在就是绑定在(!IsPostBack)外面绑定是可以获取到值的,但故障值对应的ID一直是A情况的。 绑定放到(!IsPostBack)里面是可以获取到A、B两种情况故障值分别对应的ID,但是又取不到页面上的赋值。 (TextBox)grdErrorType.Items[j].FindControl("Duration") 与 (TextBox)grdErrorType.Items[0].Cells[0].FindControl("Duration") 就是Cells[num] num我试了0-6左右多个值都没有取到页面中输入的相应的值。 当然DataGrid绑定在(!IsPostBack)外面绑定时(TextBox)grdErrorType.Items[j].FindControl("Duration") 是可以取到输入的值的。但这种不符合B的这种情况! 版主请指点。。。
  • 打赏
  • 举报
回复
引用 7 楼 tong386166552 的回复:
我感觉是绑定赋值的问题。 html页面是可以获取Page_Load绑定的值的。因为Page_Load在Render之前。
现在就是绑定在(!IsPostBack)外面绑定是可以获取到值的,但故障值对应的ID一直是A情况的。 绑定放到(!IsPostBack)里面是可以获取到A、B两种情况故障值分别对应的ID,但是又取不到页面上的赋值。
小大飞 2017-01-16
  • 打赏
  • 举报
回复
我感觉是绑定赋值的问题。 html页面是可以获取Page_Load绑定的值的。因为Page_Load在Render之前。
  • 打赏
  • 举报
回复
引用 5 楼 fengsuiyingdong 的回复:
[quote=引用 4 楼 starfd 的回复:] 需要指定是第几个Cell
版主,我试了指定后获取值依然是null[/quote] 把DataGrid的绑定给放在(!IsPostBack)外面Page_Load里面时是可以取到的。只是B种情况保存门限时获取故障在表中的Nid时总是取得是A的该故障对应的Nid,当然原因是因为先执行Page_Load时总是会绑定A的DataGrid。 所以我认为应该(!IsPostBack)里面但放里面取页面输入的值又为null,这就是尴尬的地方
  • 打赏
  • 举报
回复
引用 4 楼 starfd 的回复:
需要指定是第几个Cell
版主,我试了指定后获取值依然是null
  • 打赏
  • 举报
回复
需要指定是第几个Cell
  • 打赏
  • 举报
回复
Item[j].Cells[0].FindControl
  • 打赏
  • 举报
回复
我自已认为原因可能就出在代码: this.hidImportantField.Value = "0"; BindErrorTypeGrid(); 我给放在了(!IsPostBack)里面,但放在外面时无法动态的改变隐藏域 this.hidImportantField.Value的值。 该值为0 代表”非重保其“即A情况,为1 代表”重保其“即B情况.放在外面时即使点击的是B情况的保存按钮也会在Page_Load方法里执行一次绑定A情况的DataGrid,请问 有方法能动态改变Page_Load方法中 this.hidImportantField.Value的值吗?因为页面的执行顺序不能从前台改变再从Page_Load方法中获取的。
  • 打赏
  • 举报
回复
DataGrid绑定方法在(!IsPostBack)中时如图:

点击保存A或B时故障名称对应的主键可以拿到但页面中TextBox的值却为null,如图:


我个人觉得DataGrid绑定方法是应该放在(!IsPostBack)中的,因为在其外面时按钮点击事件时总是会执行Page_load事件再绑定一次。

不知为什么取不到相应故障对应的页面中的TextBox的值呢?

62,046

社区成员

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

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

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

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