于昨天晚上看到视频做到这个例子,但是发现始终有错误,在ListView的ItemCreated事件中使用了ClientID则会导致数据插入数据库失败。当点击插入按钮时,网页就像点击F5刷新一样,无任何数据插入数据库。而把ClientID删除,重新启动程序,插入数据一切正常。于今天在网上查了一下资料,发现原来这是微软的一个Bug地址如下:http://connect.microsoft.com/VisualStudio/feedback/details/328680/problem-accessing-controls-clientid-on-asp-net-listviews-itemcreated但是好像现在都没有更新,但是这里面给了几个解决方案,对与一般性的问题都可以解决了,但是对于这个问题,还是没有很好的解决,通过查资料发现在ItemCreated事件中使用ClientID属性会将客户端渲染的id号改变,所以就出现了不能插入、与更新数据,下面给出解决方法,其实方法较简单(晕,当时怎么没有想到)
protected void ListView1_ItemCreated(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.InsertItem)
{
DropDownList dp = (DropDownList)e.Item.FindControl("dpLinkType");
TextBox logurl = (TextBox)e.Item.FindControl("logurl");
if (dp != null && logurl != null)
{
string myid = "findid";
logurl.Attributes["findID"] = myid;//通过这里为要找到的服务端控件给一个自定义的标识,注意这里还是不能使用ClientID这个属性,不然就会有错
dp.Attributes["onchange"] = "dpchange(this,'"+myid+"')";//传到客户端的JQuery方法中也用这个表示,然后通过属性选择器就可以找到相应的控件了
if (dp.SelectedValue == "Text")
{
logurl.Style["display"] = "none";
}
}
}
客户端代码:
<script src="../js/jquery-1.4.2.js" type="text/javascript"></script>
<script type="text/javascript">
function dpchange(src, dpClientid) {
var $logo = $("input[findID=" + dpClientid + "]");//通过从服务器端传来的参数,找到相应的控件;
if ($(src).val() == "Text") {
$logo.hide();
}
else {
$logo.show();
}
}
</script>