浅谈ListView中的一个Bug

原创 2012年03月27日 22:26:14
        protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.InsertItem)
            {
                System.Web.UI.WebControls.DropDownList ddlLinkType = (System.Web.UI.WebControls.DropDownList)e.Item.FindControl("DropDownListLinkType");
                if (ddlLinkType != null)
                {
                    TextBox LogoUrlTextBox = (TextBox)e.Item.FindControl("LogoUrlTextBox");                            
		 if (LogoUrlTextBox != null)
                    {
                        ddlLinkType.Attributes["onchange"] = "ddlonchange(this,'" + LogoUrlTextBox.ClientID + "')";
                    }
                }
            }
        }

1.在后台为前台控件添加javascript注册事件,发现数据无法“插入”、“更改”。

 


 

ddlLinkType.Attributes["onchange"] = "ddlonchange(this,'" + LogoUrlTextBox.ClientID + "')";


2.注销该代码程序又可以进行“插入”、“更改”。

 

     <tr style="">
                    <td>
                        <input type="submit" name="ctrl1$InsertButton" value="插入" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctrl1$InsertButton", "", true, "Insert", "", false, false))" id="ctrl1_InsertButton" />
                        <input type="submit" name="ctrl1$CancelButton" value="清除" id="ctrl1_CancelButton" />
                    </td>
                    <td>
                         </td>
                    <td>
                        <input name="ctrl1$SiteNameTextBox" type="text" id="ctrl1_SiteNameTextBox" />
                        <span id="ctrl1_RequiredFieldValidator1" style="color:Red;visibility:hidden;">*</span>
                    </td>
                    <td>
                    <select name="ctrl1$insertddlLinkType" id="ctrl1_insertddlLinkType" onchange="ddlonchange(this,'ctrl1_LogoUrlTextBox')">
					<option value="LogoLink">图片连接</option>
					<option value="TextLink">文本连接</option>

				</select>
                    </td>
                    <td>
                        <input name="ctrl1$LogoUrlTextBox" type="text" id="ctrl1_LogoUrlTextBox" />
                    </td>
                    <td>
                        <input name="ctrl1$SiteUrlTextBox" type="text" id="ctrl1_SiteUrlTextBox" />
                         <span id="ctrl1_RequiredFieldValidator2" style="color:Red;visibility:hidden;">*</span>

                    </td>
                </tr>


3.查看渲染到浏览器的代码,发现InsertItemTemplate里的所有ID号都缺少"ListView_"前缀。通过对事件分析,ListView创建前触发了ItemCreated事件,在事件里使用ClientID

导致了InsertItemTemplate模块中的控件渲染到浏览器端后的id值就没有“ListView1_”这个前缀,点击按钮,就无法把数据插入到ListView里。

4.在微软也发布了这个Bug

  文章地址:http://connect.microsoft.com/VisualStudio/feedback/details/328680/problem-accessing-controls-clientid-on-asp-net-listviews-itemcreated

 

 

5.经过分析,可以将注册到InsertItemTemplate的事件代码放到dataBound中运行,应为当运行到InsertItemTemplate时,就会调用此事件

 

 public static Control FindControl(string controlId, ControlCollection controls)
        {
            foreach (Control control in controls)
            {
                if (control.ID == controlId)
                    return control;
                if (control.HasControls())
                {
                    Control nestedControl = FindControl(controlId, control.Controls);
                    if (nestedControl != null)
                        return nestedControl;
                }
            }
            return null;
        }

 protected void ListView1_DataBound(object sender, EventArgs e)
        {
            System.Web.UI.WebControls.DropDownList ddlLinkType = FindControl("insertddlLinkType", ListView1.Controls) as System.Web.UI.WebControls.DropDownList;
            TextBox LogoUrlTextBox = (TextBox)FindControl("LogoUrlTextBox", ListView1.Controls);
            RequiredFieldValidator validator = FindControl("RequiredFieldValidator1", ListView1.Controls) as RequiredFieldValidator;
            if (ddlLinkType != null && LogoUrlTextBox != null && validator != null)
            {
                ddlLinkType.Attributes["onchange"] = "ddlonchange(this,'" + LogoUrlTextBox.ClientID + "','" + validator.ClientID + "')";
            }
        }


6.采用微软的解决方案。。很好的处理这个难题,,到了.NET4.0也没有处理这个Bug,以后可以采用这样的办法处理。

 

以亲身感受浅谈程序的注释和一个bug的代价(单位:RMB)

某位高人说过, 程序是写给人看的, 计算机只是顺便运行一下而已。 个人觉得这句话非常有道理。...
  • stpeace
  • stpeace
  • 2014年08月27日 00:22
  • 1536

与端口冲突有关的一个低概率bug的定位过程(这次不是360的错啊)---浅谈bind()函数返回失败

测试同事提单反馈: 工具A的x功能会低概率失效, 但没有发现什么规律。事实上, 我也确实遇到过这个低概率问题, 但是没有深入去分析过它(实际上也不是什么概率不概率, 只要发生了, 就会一直发生, 直到...
  • stpeace
  • stpeace
  • 2015年01月10日 22:16
  • 1252

asp.net中ListView的一个Bug

作者:杨中科今天一个学生问了一个问题,他的程序监听ListView的ItemCreated事件,然后在事件响应函数中用FindControl定位InsertTemplate中的控件,然后使用控件的Cl...

记一个使用中常见的关于ListView和Adapter的BUG

如题,代码中用到了ListView并用到了一个简单的SimpleAdapter来适配其中的List。    其中在调试的时候会遇到弹错,log如下      E/MessageQueue-JNI(...

(4.2.12.3)浅谈第三方推送[bug查询]:百度推送、小米推送、华为推送

前言(常见坑): 小心是AndroidManifest文件被别人改动过。。。。。。 升级推送SDK时往往可能会引入新问题。。。。。除非有重大更新,否则可以延迟2个版本进行升级 为了更好应对出问题的用户...

浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是Fragment带来的一些优点,比如说:Fragment可以使你能够将a...

浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是Fragment带来的一些优点,比如说:Fragment可以使你能够将a...

从MySQL Bug#67718浅谈B+树索引的分裂优化

问题背景 今天,看到Twitter的DBA团队发布了其最新的MySQL分支:Changes in Twitter MySQL 5.5.28.t9,此分支最重要的一个改进,就是修复了MySQL 的Bu...
  • yjh314
  • yjh314
  • 2016年07月07日 14:41
  • 283

浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

原文链接 自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确实是Fragment带来的一些优点,比如说:Fragme...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:浅谈ListView中的一个Bug
举报原因:
原因补充:

(最多只允许输入30个字)