我在LISTVIEW的ItemCreated事件中为一个DropDownList添加onchange事件,传入另一个TextBox的CLIENTID,但是在客户端的HTML中查看,最终的ID和该CLIENTID不一致,获取到的ID是:ctrl2_logoURLTextBox,而最终的ID是:ListView1_ctrl2_logoURLTextBox,在前面多了一个LISTVIEW_,不知道是什么原因?具体的代码如下:
C#代码:
protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e)
        {
            if (e.Item.ItemType == ListViewItemType.DataItem || e.Item.ItemType == ListViewItemType.InsertItem)
            {
                DropDownList ddLinktype = (DropDownList)e.Item.FindControl("ddlLinkType");
                TextBox logoUrltextBox = (TextBox)e.Item.FindControl("logoURLTextBox");
                if (ddLinktype != null && logoUrltextBox !=null)
                {
                    ddLinktype.Attributes["onchange"] = "onLinkTypeChange(this,'"+logoUrltextBox.ClientID+"')";
                }
                if (ddLinktype.SelectedValue == "Text")
                {
                    if (logoUrltextBox != null)    logoUrltextBox.Style["display"] = "none";                }
            }
        }最终生成的HTML代码: <td>
                    <select name="ListView1$ctrl2$ddlLinkType" id="ListView1_ctrl2_ddlLinkType" onchange="onLinkTypeChange(this,&#39;ctrl2_logoURLTextBox&#39;)">
<option selected="selected" value="Text">文本</option>
<option value="Pic">图片</option> </select>
                </td>
                <td>
                    <input name="ListView1$ctrl2$siteURLTextBox" type="text" id="ListView1_ctrl2_siteURLTextBox" /><span id="ListView1_ctrl2_RequiredFieldValidator3" style="color:Red;visibility:hidden;">*</span>
                </td>
                <td>
                    <input name="ListView1$ctrl2$logoURLTextBox" type="text" id="ListView1_ctrl2_logoURLTextBox" style="display:none;" />
                </td>
            </tr>

解决方案 »

  1.   

    复合控件内的控件ClientID的命名大概就是这样的,会自动加上父控件名ListView1。你知道它的命名规则就好办了。自己拼一下:ListView1.ClientID+"_"+logoUrltextBox.ClientID
      

  2.   

    谢谢 ,我使用的是VS2010  .NET4.0出现了上面的问题,我把.NET切换到3.5,他出来的CLIENTID就对了。不知为何?
      

  3.   

    asp.net 4.0中控件有一个ClientMode的新属性,可能该属性的值设为Inherit(继承)了,你可以参看这篇文章:
    http://www.cnblogs.com/worksguo/archive/2009/09/04/1560222.html
      

  4.   

    3.5 和4.0 的 clientid不一样 
      

  5.   

    你搞错(在生命期中的)位置了。应该在ItemDataBound事件中去处理这个,而不是ItemCreated。
      

  6.   

    可以这样去理解,Created的时候只是创建了Item,还没有把它放入ListView呢。
      

  7.   

    据说是VS2010的BUG,传智的那个教程上讲的。
      

  8.   

    受教了!ItemDataBound事件中,怎么不执行InsertItem呢?想取InsertItemTemplate模板里的控件ID该怎么办呢?