我的updatepanel有个非常非常奇怪的问题。我做了一个省市联动的三联dropdownlist,把内容存储于XML内,并添加了三个button:“修改”,“删除”,“添加”功能来修改dropdownlist中的内容,并作为updatepanel的trigger。 其他一切正常,但是放在updatepanel内的dropdownlist在“修改”,“删除”,“添加”之后都不能立即更新,而要再点一次才能看到新的结果。我trace了一下,点完button后,xml已经做了修改,而且我也重新绑定了dropdownlist,甚至还手动添加了updatepanel.update()事件,但updatepanel就是不能立即更新。 我觉得是不是trigger使updatepanel更新的事件要先于后台的button_click的code呢?不过这也太说不过去了,请各位大大看看!
1、前台:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <div style="width:30%; float:left">
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional">
<ContentTemplate>
所在地区<br />
<asp:TextBox ID="XML1TextBox1" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML1change" runat="server" Text="修改" OnClick="XML1change_Click" />
<br />
<asp:ListBox ID="XML1ListBox" runat="server" AutoPostBack="True"
Width="106px" Height="150px"
onselectedindexchanged="XML1ListBox_SelectedIndexChanged"
DataSourceID="XmlDataSource1" DataTextField="name" DataValueField="name"></asp:ListBox>
<asp:Button ID="XML1delete" runat="server" Text="删除" onclick="XML1delete_Click"/>
<br />
<asp:TextBox ID="XML1TextBox2" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML1add" runat="server" Text="添加" onclick="XML1add_Click"
PostBackUrl="~/XMLs/SetXMLs.aspx" />
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Citys.xml"
XPath="所在省份/所在地区"></asp:XmlDataSource>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="XML1add" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML1change" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML1delete" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML1ListBox"
EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
<asp:Button ID="Button1" runat="server" Text="change" onclick="Button1_Click" />
</div>
<div style="width:30%; float:left">
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
所在市县<br />
<asp:TextBox ID="XML2TextBox1" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML2change" runat="server" Text="修改"
onclick="XML2change_Click"/>
<br />
<asp:ListBox ID="XML2ListBox" runat="server" AutoPostBack="True"
Width="106px" Height="150px" DataSourceID="XmlDataSource2"
DataTextField="name" DataValueField="name"
onselectedindexchanged="XML2ListBox_SelectedIndexChanged" ></asp:ListBox>
<asp:Button ID="XML2delete" runat="server" Text="删除"
onclick="XML2delete_Click" />
<br />
<asp:TextBox ID="XML2TextBox2" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML2add" runat="server" Text="添加" onclick="XML2add_Click"
style="height: 26px" />
<asp:XmlDataSource ID="XmlDataSource2" runat="server" DataFile="~/Citys.xml"
XPath="所在省份/所在地区/所在市县"></asp:XmlDataSource> </ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="XML2add" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML2change" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML2delete" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML1ListBox"
EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
</div>
<div style="width:30%; float:left">
所在市区<br />
<asp:TextBox ID="XML3TextBox1" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML3change" runat="server" Text="修改"/>
<br />
<asp:ListBox ID="XML3ListBox" runat="server" AutoPostBack="True"
DataSourceID="XmlDataSource3" DataTextField="name" DataValueField="name"
Width="106px" Height="150px"></asp:ListBox>
<asp:Button ID="XML3delete" runat="server" Text="删除"/>
<br />
<asp:TextBox ID="XML3TextBox2" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML3add" runat="server" Text="添加" />
<asp:XmlDataSource ID="XmlDataSource3" runat="server" DataFile="~/Citys.xml"
XPath="所在省份/所在地区"></asp:XmlDataSource>
</div> </div>
</form>
</body>
</html>
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Linq;
using System.Xml.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
XML1db();
XML2db();
XML3db();
}
}
public void XML1db()
{
XML1ListBox.Items.Clear();
XML1ListBox.DataBind();
} public void XML2db()
{
XML2ListBox.Items.Clear();
XmlDataSource2.DataFile = "~/Citys.xml";
if (XML1ListBox.SelectedValue != "")
{
XmlDataSource2.XPath = "所在省份/所在地区[@name='" + XML1ListBox.SelectedValue.ToString() + "']/所在市县";
}
else
{
XmlDataSource2.XPath = "所在省份/所在地区[@name='请选择']/所在市县";
} XML2ListBox.DataBind();
} public void XML3db()
{ XML3ListBox.Items.Clear();
XmlDataSource3.DataFile = "~/Citys.xml";
if (XML2ListBox.SelectedValue != "")
{
XmlDataSource3.XPath = "所在省份/所在地区/所在市县[@name='" + XML2ListBox.SelectedValue.ToString() + "']/所在市区";
}
else
{
XmlDataSource3.XPath = "所在省份/所在地区/所在市县[@name='请选择']/所在市区";
}
XML3ListBox.DataSourceID = "XmlDataSource3";
XML3ListBox.DataTextField = "name";
XML3ListBox.DataBind();
} protected void XML1ListBox_SelectedIndexChanged(object sender, EventArgs e)
{
XML1TextBox1.Text = XML1ListBox.SelectedValue.ToString();
XML2db();
}
protected void XML2ListBox_SelectedIndexChanged(object sender, EventArgs e)
{
XML2TextBox1.Text = XML2ListBox.SelectedValue.ToString();
XML3db();
}
protected void XML1change_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区"); foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
Lv1xn.Attributes["name"].Value = XML1TextBox1.Text.ToString();
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML1db(); } protected void XML2change_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区"); foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
XmlNodeList Lv2xnl = Lv1xn.SelectNodes("所在市县"); if (XML2ListBox.SelectedValue != "")
{
foreach (XmlNode Lv2xn in Lv2xnl)
{
if (Lv2xn.Attributes["name"].Value.Equals(XML2ListBox.SelectedValue.ToString()))
{
Lv2xn.Attributes["name"].Value = XML2TextBox1.Text.ToString();
}
}
}
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML2db();
} protected void XML1delete_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区"); foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
Lv1xn.Attributes["name"].RemoveAll();
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML1db(); }
protected void XML2delete_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区"); foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
XmlNodeList Lv2xnl = Lv1xn.SelectNodes("所在市县"); if (XML2ListBox.SelectedValue != "")
{
foreach (XmlNode Lv2xn in Lv2xnl)
{
if (Lv2xn.Attributes["name"].Value.Equals(XML2ListBox.SelectedValue.ToString()))
{
Lv2xn.Attributes["name"].RemoveAll();
}
}
}
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML2db();
} protected void XML1add_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区");
XmlElement xe = xd.CreateElement("所在地区");
xe.SetAttribute("name", XML1TextBox2.Text.ToString()); if (XML1ListBox.SelectedValue == "")
{
xd.SelectSingleNode("所在省份").AppendChild(xe);
}
else
{
foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
XmlNode xn = (XmlNode)Lv1xn; xd.SelectSingleNode("所在省份").InsertAfter(xe, xd); }
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML1db();
} protected void XML2add_Click(object sender, EventArgs e)
{ XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区"); foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
XmlNodeList Lv2xnl = Lv1xn.SelectNodes("所在市县");
XmlElement xe = xd.CreateElement("所在市县");
xe.SetAttribute("name", XML2TextBox2.Text.ToString()); if (XML2ListBox.SelectedValue == "")
{
Lv1xn.AppendChild(xe);
}
else
{
foreach (XmlNode Lv2xn in Lv2xnl)
{
if (Lv2xn.Attributes["name"].Value.Equals(XML2ListBox.SelectedValue.ToString()))
{
XmlNode xn = (XmlNode)Lv2xn;
Lv1xn.InsertAfter(xe, xn);
}
}
}
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML2db();
}
protected void Button1_Click(object sender, EventArgs e)
{
}
}3、XML:<?xml version="1.0" encoding="utf-8"?>
<所在省份>
<所在地区 name="请选择">
<所在市县 name="请选择">
<所在市区 name="请选择" />
</所在市县>
</所在地区>
<所在地区 name="长春地区">
<所在市县 name="长春市本级">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="九台">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="榆树">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="德惠">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="农安">
<所在市区 name="南关" />
</所在市县>
</所在地区>
<所在地区 name="吉林地区">
<所在市县 name="吉林市本级">
<所在市区 name="松北二区" />
</所在市县>
<所在市县 name="舒兰" />
<所在市县 name="永吉" />
<所在市县 name="111" />
</所在地区>
<所在地区 name="四平地区111">
</所在地区>
<所在地区 name="辽源地区">
</所在地区>
<所在地区 name="松原地区">
</所在地区>
<所在地区 name="白城地区">
</所在地区>
<所在地区 name="延边州地区">
</所在地区>
<所在地区 name="长白山管委会" />
<所在地区 name="通化地区" />
</所在省份>
平台环境:我用的VS2010,在windowxp上做的调试,已经把代码独立出来了,各位只要新建个页,把代码贴进去,并改一下XML的文件名就能运行了,如能解决,不胜感激!大家主要看updatepanel 1 里的内容就行,代码里都叫XML1什么什么。
1、前台:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager> <div style="width:30%; float:left">
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional">
<ContentTemplate>
所在地区<br />
<asp:TextBox ID="XML1TextBox1" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML1change" runat="server" Text="修改" OnClick="XML1change_Click" />
<br />
<asp:ListBox ID="XML1ListBox" runat="server" AutoPostBack="True"
Width="106px" Height="150px"
onselectedindexchanged="XML1ListBox_SelectedIndexChanged"
DataSourceID="XmlDataSource1" DataTextField="name" DataValueField="name"></asp:ListBox>
<asp:Button ID="XML1delete" runat="server" Text="删除" onclick="XML1delete_Click"/>
<br />
<asp:TextBox ID="XML1TextBox2" runat="server" Width="100px"></asp:TextBox>
<asp:Button ID="XML1add" runat="server" Text="添加" onclick="XML1add_Click"
PostBackUrl="~/XMLs/SetXMLs.aspx" />
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Citys.xml"
XPath="所在省份/所在地区"></asp:XmlDataSource>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="XML1add" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML1change" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML1delete" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="XML1ListBox"
EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
</div> </div>
</form>
</body>
</html>2、后台:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using System.Linq;
using System.Xml.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;public partial class Default2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
XML1db();
}
}
public void XML1db()
{
XML1ListBox.Items.Clear();
XML1ListBox.DataBind();
}
protected void XML1ListBox_SelectedIndexChanged(object sender, EventArgs e)
{
XML1TextBox1.Text = XML1ListBox.SelectedValue.ToString(); } protected void XML1change_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区"); foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
Lv1xn.Attributes["name"].Value = XML1TextBox1.Text.ToString();
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML1db(); } protected void XML1delete_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区"); foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
Lv1xn.Attributes["name"].RemoveAll();
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML1db(); }
protected void XML1add_Click(object sender, EventArgs e)
{
XmlDocument xd = new XmlDocument();
xd.Load(Server.MapPath("~/Citys.xml"));
XmlNodeList Lv1xnl = xd.SelectSingleNode("所在省份").SelectNodes("所在地区");
XmlElement xe = xd.CreateElement("所在地区");
xe.SetAttribute("name", XML1TextBox2.Text.ToString()); if (XML1ListBox.SelectedValue == "")
{
xd.SelectSingleNode("所在省份").AppendChild(xe);
}
else
{
foreach (XmlNode Lv1xn in Lv1xnl)
{
if (Lv1xn.Attributes["name"].Value.Equals(XML1ListBox.SelectedValue.ToString()))
{
XmlNode xn = (XmlNode)Lv1xn; xd.SelectSingleNode("所在省份").InsertAfter(xe, xd); }
}
} xd.Save(Server.MapPath("~/Citys.xml"));
XML1db();
}
}3、XML:
<?xml version="1.0" encoding="utf-8"?>
<所在省份>
<所在地区 name="请选择">
<所在市县 name="请选择">
<所在市区 name="请选择" />
</所在市县>
</所在地区>
<所在地区 name="长春地区">
<所在市县 name="长春市本级">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="九台">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="榆树">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="德惠">
<所在市区 name="南关" />
</所在市县>
<所在市县 name="农安">
<所在市区 name="南关" />
</所在市县>
</所在地区>
<所在地区 name="吉林地区">
<所在市县 name="吉林市本级">
<所在市区 name="松北二区" />
</所在市县>
<所在市县 name="舒兰" />
<所在市县 name="永吉" />
<所在市县 name="111" />
</所在地区>
<所在地区 name="四平地区">
</所在地区>
<所在地区 name="辽源地区">
</所在地区>
<所在地区 name="松原地区">
</所在地区>
<所在地区 name="白城地区">
</所在地区>
<所在地区 name="延边州地区">
</所在地区>
<所在地区 name="长白山管委会" />
<所在地区 name="通化地区" />
</所在省份>
我自学成才的,好多事情不懂,刚才上网又查了下,如果是XML需要加随机数,请问我空间引用的xml文件,怎么加随机数啊?
具体代码是什么,能帮忙写一下么?
即再执行
DropDownlist1.DataBind();
DropDownlist2.DataBind();
xd.Load(Server.MapPath("~/Citys.xml?=" + DateTime.Now.ToString()));
xd.Save(Server.MapPath("~/Citys.xml?=" + DateTime.Now.ToString()));
但是提示“Illegal characters in path.”
估计是写的不对,请各位看看应该怎么写啊,是在这个环节加随机数呢,还是在dropdownlist绑定的时候改datafile的路径呢?
既不会刷新页面,也不需要去缓存。
为什么第二次点击会刷新结果呢?这说明dropdownlist并不总是读取的旧的XML,在某个环节,它肯定调用了新的XML到缓存里。这个步骤就是:
xd.Save(Server.MapPath("~/Citys.xml")); !!!!!!!!!!!!!!
也就是说,在重新给dropdownlist绑定数据之前,重新开一下xml就行了!就是这样:
xd.Save(Server.MapPath("~/Citys.xml"));
xd.Load(Server.MapPath("~/Citys.xml"));
xd.Load(Server.MapPath("~/Citys.xml"));
XML1db();
然后就皆大欢喜了!!!!我太他妈聪明了!
xd.Save(Server.MapPath("~/Citys.xml"));呵呵。
xd.Save(Server.MapPath("~/Citys.xml"));
xd.Load(Server.MapPath("~/Citys.xml"));
xd.Save(Server.MapPath("~/Citys.xml"));
xd.Load(Server.MapPath("~/Citys.xml"));
XML2db();