在DataList里删除一条记录后,当前界面的数据没有刷新,而后台数据库已删除,需按“刷新”按纽后数据才刷新出来,这是为什么?
不只是“删除”后数据没有刷新,连“更新”、“创建”等情况也一样,急,在线等待!
界面(admin_Menu.aspx):
<%@ Page language="c#" Codebehind="admin_Menu.aspx.cs" AutoEventWireup="false" Inherits="DT.Admin_Menu" %>
<%@ Import namespace="DT" %>
<HTML><HEAD></HEAD><body bgColor="#d6dff7"><form runat="server">
<table width="90%" align="center" cellspacing="0" cellpadding="0">
<tr valign="middle">
<td colspan="3" class="tp">
<span class="title">>>菜单管理</span>
</td>
</tr>
<tr>
<td class="tl"></td>
<td height="30" align="center" valign="middle">
<asp:Label id="MsgText" runat="server" Height="25" CssClass="Message"></asp:Label>
</td>
<td class="tr"></td>
</tr>
<tr>
<td class="tl"></td>
<td>
<table align="center" cellspacing="0" cellpadding="0">
<TBODY>
<tr>
<td>
<asp:DataList id="MenuList" runat="server" Width="100%" Height="100%">
<HeaderTemplate>
<TABLE id="MenuTable" cellSpacing="1" cellPadding="3" width="100%" border="0">
<TR>
<TD width="10%">ID</TD>
<TD>名称</TD>
<TD width="20%">URL</TD>
<td width="30%">描述</td>
<td width="40%">动作</td>
</TR>
</HeaderTemplate>
<FooterTemplate>
<tr>
<TD>ID</TD>
<TD><asp:TextBox Runat="server" ID="NewMenuName"></asp:TextBox></TD>
<TD><asp:TextBox Runat="server" ID="NewMenuURL"></asp:TextBox></TD>
<td><asp:TextBox Runat="server" ID="NewMenuRemark"></asp:TextBox></td>
<td><asp:Button ID="CreateMenu" runat="server" width="60" Text='创建'></asp:Button></td>
</tr>
</table>
</FooterTemplate>
<ItemTemplate>
<tr>
<TD><asp:TextBox ID="OldMenuId" runat="server" Visible="false" Text='<%# DataBinder.Eval(Container.DataItem, "ID") %>'></asp:TextBox><%# DataBinder.Eval(Container.DataItem, "ID") %></TD>
<TD><asp:TextBox ID="OldMenuName" runat="server" Visible="false" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>'></asp:TextBox><%# DataBinder.Eval(Container.DataItem, "Name") %></TD>
<TD><%# DataBinder.Eval(Container.DataItem, "URL") %></TD>
<TD><%# DataBinder.Eval(Container.DataItem, "Remark") %></TD>
<TD><asp:Button id="EditMenu" CommandName="Edit" runat="server" width="60" Text='编辑'></asp:Button>
<asp:Button id="DeleteMenu" CommandName="Delete" runat="server" width="60" Text='删除'></asp:Button></TD>
</tr>
</ItemTemplate>
<EditItemTemplate>
<TR>
<TD><asp:TextBox ID="MenuID" Runat="server" Visible="False" Text='<%# DataBinder.Eval(Container.DataItem, "ID") %>'></asp:TextBox><%# DataBinder.Eval(Container.DataItem, "ID") %></TD>
<TD><asp:TextBox ID="MenuName" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Name") %>'></asp:TextBox></TD>
<TD><asp:TextBox ID="MenuURL" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "URL") %>'></asp:TextBox></TD>
<TD><asp:TextBox ID="MenuRemark" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Remark") %>'></asp:TextBox></TD>
<TD><asp:Button id="UpdateMenu" runat="server" CommandName="Update" width="60" Text='更新'></asp:Button>
<asp:Button id="CancelMenu" runat="server" CommandName="Cancel" width="60" Text='取消'></asp:Button></TD>
</TR>
</EditItemTemplate>
</asp:DataList>
</td>
</tr>
</table>
</TD>
<td class="tr"></td>
</TR>
<tr>
<td colspan="3" class="tm"></td>
</tr>
</TBODY></TABLE></form></body></HTML>
问题点数:50、回复次数:22Top
1 楼znu991(阿晓)回复于 2005-06-03 17:43:23 得分 0
代码(admin_Menu.aspx):
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace DT
{
public class Admin_Menu : System.Web.UI.Page
{
protected static string ConnTemp = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" + HttpContext.Current.Server.MapPath("Data") + "\\data.mdb";
protected OleDbConnection OleDbConnectionTemp;
protected System.Data.OleDb.OleDbCommand OleDbCommandTemp;
protected System.Data.OleDb.OleDbDataAdapter OleDbDataAdapterTemp;
protected DataSet DataSetTemp;
protected System.Web.UI.WebControls.DataList MenuList;
protected System.Data.DataSet DataSet1;
protected System.Web.UI.WebControls.Label MsgText;
protected string sql = null;
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
if (!Page.IsPostBack)
{
BindData();
}
}
void BindData()
{
OleDbConnectionTemp = new OleDbConnection(ConnTemp);
sql = "SELECT ID,Name,URL,Remark FROM DictData where Type=0";
OleDbDataAdapterTemp = new OleDbDataAdapter(sql,OleDbConnectionTemp);
DataSetTemp = new DataSet();
OleDbDataAdapterTemp.Fill(DataSetTemp);
MenuList.DataSource = DataSetTemp.Tables[0].DefaultView;
MenuList.DataBind();
OleDbConnectionTemp.Close();
}
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
this.MenuList.EditCommand += new DataListCommandEventHandler(MenuList_EditCommand);
this.MenuList.DeleteCommand += new DataListCommandEventHandler(MenuList_DeleteCommand);
this.MenuList.UpdateCommand += new DataListCommandEventHandler(MenuList_UpdateCommand);
this.MenuList.CancelCommand += new DataListCommandEventHandler(MenuList_CancelCommand);
this.MenuList.ItemCommand +=new DataListCommandEventHandler(MenuList_ItemCommand);
this.MenuList.ItemCreated += new DataListItemEventHandler(MenuList_ItemCreated);
}
private void MenuList_EditCommand(object sender, DataListCommandEventArgs e)
{
this.MenuList.EditItemIndex = e.Item.ItemIndex;
BindData();
}
private void MenuList_DeleteCommand(object sender, DataListCommandEventArgs e)
{
TextBox OldMenuID = (TextBox)e.Item.FindControl("OldMenuID");
TextBox OldMenuName = (TextBox)e.Item.FindControl("OldMenuName");
sql = "DELETE FROM DICTDATA WHERE [ID]="+OldMenuID.Text.Trim();
try
{
Pub.ExeSql(sql);
}
catch (Exception ex)
{
this.MsgText.Text = "菜单:"+OldMenuName.Text.Trim()+" 不删除成功,请重试!";
}
finally
{
this.MsgText.Text = "菜单:" + OldMenuName.Text.Trim() + " 删除成功!";
this.MenuList.EditItemIndex = -1;
BindData();
}
}
private void MenuList_UpdateCommand(object sender, DataListCommandEventArgs e)
{
TextBox MenuID = (TextBox)e.Item.FindControl("MenuID");
TextBox MenuName = (TextBox)e.Item.FindControl("MenuName");
TextBox MenuURL = (TextBox)e.Item.FindControl("MenuURL");
TextBox MenuRemark = (TextBox)e.Item.FindControl("MenuRemark");
sql = "UPDATE DICTDATA SET [NAME]='"+Pub.FormatSQL(MenuName.Text)+"',[URL]='"+Pub.FormatSQL(MenuURL.Text)+"',[Remark]='"+Pub.FormatSQL(MenuRemark.Text)+"' where [ID]="+MenuID.Text.Trim();
try
{
Pub.ExeSql(sql);
}
catch (Exception ex)
{
this.MsgText.Text = "菜单:"+MenuName.Text.Trim()+" 更新失败,请重试!";
}
finally
{
this.MsgText.Text = "菜单:" + MenuName.Text.Trim() + " 更新成功!";
this.MenuList.EditItemIndex = -1;
BindData();
}
}
private void MenuList_CancelCommand(object sender, DataListCommandEventArgs e)
{
this.MenuList.EditItemIndex = -1;
BindData();
}
private void MenuList_ItemCommand(object sender, DataListCommandEventArgs e)
{
if (e.Item.ItemType == ListItemType.Footer )
{
TextBox NewMenuName = (TextBox)e.Item.FindControl("NewMenuName");
TextBox NewMenuURL = (TextBox)e.Item.FindControl("NewMenuURL");
TextBox NewMenuRemark = (TextBox)e.Item.FindControl("NewMenuRemark");
sql = "Insert into DICTDATA ([Name],[URL],[Remark]) values ('"+Pub.FormatSQL(NewMenuName.Text.Trim())+"','"+Pub.FormatSQL(NewMenuURL.Text.Trim())+"','"+Pub.FormatSQL(NewMenuRemark.Text.Trim())+"')";
try
{
Pub.ExeSql(sql);
}
catch (Exception ex)
{
this.MsgText.Text = "菜单:"+NewMenuName.Text.Trim()+" 创建失败,请重试!";
}
finally
{
this.MsgText.Text = "菜单:" + NewMenuName.Text.Trim() + " 创建成功!";
this.MenuList.EditItemIndex = -1;
BindData();
}
}
}
private void MenuList_ItemCreated(Object sender, DataListItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item)
{
Button DeleteMenu = (Button)e.Item.FindControl("DeleteMenu");
DeleteMenu.Attributes.Add("onclick","return confirm('确认要删除吗?')");
}
}
}
}Top
2 楼wssmax(请叫我三角猫)回复于 2005-06-03 17:59:49 得分 5
// 在此处放置用户代码以初始化页面
if (!Page.IsPostBack)
{
BindData();
}
就是这里那Top
3 楼yipiaoqingshui(一瓢清水)回复于 2005-06-03 18:00:24 得分 0
当刷新的时候才会重新去读服务器上的数据.所以不刷新的时候自然显示的是旧的.
不可能一直都连着数据库.哪网站肯定得完蛋.
你可以设置多少秒自动刷新一下...这个是可以用JS实现的
Top
4 楼wssmax(请叫我三角猫)回复于 2005-06-03 18:00:26 得分 0
去掉Top
5 楼hchxxzx(NET?摸到一点门槛)回复于 2005-06-03 18:03:45 得分 0
把这一句
this.MenuList.EditItemIndex = -1;
BindData();
放到你的try块里面.Top
6 楼yipiaoqingshui(一瓢清水)回复于 2005-06-03 18:04:38 得分 0
try
{
Pub.ExeSql(sql);
BindData();//重新绑定试试看.创建和修改
}
catch (Exception ex)
{
this.MsgText.Text = "菜单:"+MenuName.Text.Trim()+" 更新失败,请重试!";
}
Top
7 楼aaron_lly(永远,永远,等她回来!)回复于 2005-06-03 18:06:22 得分 0
在删除事件里,,,,当执行完删除命令后,,,再将datalist重新读取一次,,,Top
8 楼yipiaoqingshui(一瓢清水)回复于 2005-06-03 18:06:33 得分 5
还有个方法
try
{
Pub.ExeSql(sql);
Response.Redirect("admin_menu.aspx");//试试看.创建和修改
}
catch (Exception ex)
{
this.MsgText.Text = "菜单:"+MenuName.Text.Trim()+" 更新失败,请重试!";
}
Top
9 楼yuezhong(妈咪,有小姐吗?便宜点的)回复于 2005-06-03 18:16:02 得分 0
你操作完控制它再读一次数据
Top
10 楼luckyprg(lucky)回复于 2005-06-03 18:25:43 得分 0
删除后没有重新绑定数据。Top
11 楼znu991(阿晓)回复于 2005-06-03 18:40:26 得分 0
To hchxxzx:
把
this.MenuList.EditItemIndex = -1;
BindData();
放在try语句中,测试过不行!
To yipiaoqingshui:
Response.Redirect("admin_menu.aspx");
测试过也不行!
我想是不是DataList的设置哪能里出问题了,而不是操作后重新绑定数据(重新绑定数据的语句我都写了,看上面的源程序)。Top
12 楼OSCAR_NJU(死刑犯)回复于 2005-06-03 19:57:27 得分 0
可能是2楼说的问题Top
13 楼cgipro(迷途)回复于 2005-06-03 21:08:24 得分 0
保证程序运行
.Databind()Top
14 楼wzd24(牧野)(衣带渐宽终不悔,为伊消得人憔悴)回复于 2005-06-03 21:17:41 得分 40
没有重新设置数据源,因为DATASET和DATATABLE是脱离数据库存在的,不会和数据库同步更新。
所以必须重新填充DATASET或DATATABLE,然后重新绑定!!!
Top
15 楼Bruce_H21(麦克屎高飞)回复于 2005-06-03 21:38:30 得分 0
更新和删除数据以后肯定要重新绑定一次数据,要么数据表是不会变化的。Top
16 楼leojay1(绯村剑心)回复于 2005-06-03 22:23:44 得分 0
markTop
17 楼sp1234(asp.net不是一个语言,是一个操作系统)回复于 2005-06-03 22:32:54 得分 0
上面说的很详细了。这类问题,不用看全文,只要看事件处理之后是重建了界面,如果没有,就肯定不能显示新界面。Top
18 楼apcsherry(无敌神勇小超人)回复于 2005-06-03 23:12:48 得分 0
做好修改,删除。。等操作后再绑定一次数据读取操作!Top
19 楼YG200233(I love code,I hate code too)回复于 2005-06-03 23:31:03 得分 0
都有答案了,
2楼的方法比较不错。我就是用那个
//每天学习多一点Top
20 楼znu991(阿晓)回复于 2005-06-03 23:48:38 得分 0
To wzd24:
private void MenuList_DeleteCommand(object sender, DataListCommandEventArgs e)
{
TextBox OldMenuID = (TextBox)e.Item.FindControl("OldMenuID");
TextBox OldMenuName = (TextBox)e.Item.FindControl("OldMenuName");
sql = "DELETE FROM DICTDATA WHERE [ID]="+OldMenuID.Text.Trim();
Pub.ExeSql(sql);
MenuList.EditItemIndex = -1;
OleDbConnection tempConn = new OleDbConnection(ConnTemp);
string tempSQL = "SELECT ID,Name,URL,Remark FROM DictData where Type=0";
OleDbDataAdapter tempOleDbDataAdapter = new OleDbDataAdapter(tempSQL,tempConn);
DataSet tempDataSet = new DataSet();
tempOleDbDataAdapter.Fill(tempDataSet,"DictData");
MenuList.DataSource = tempDataSet.Tables["DictData"].DefaultView;
MenuList.DataBind();
this.MsgText.Text = "菜单:" + OldMenuName.Text.Trim() + " 删除成功!";
}
删除后的数据绑定时用到ADO.NET的所有类我都重新定义过,问题还是一样!是不是整个ASPX页面设置有问题!Top
21 楼eyych(2006)回复于 2005-06-04 01:38:29 得分 0
重新填充DATASET或DATATABLE,然后重新绑定!!!Top
22 楼znu991(阿晓)回复于 2005-06-04 11:47:00 得分 0
问题已解决了,谢谢“ wzd24(牧野) ”的提示,让我重新看了《ADO.NET技术内幕》这本书,知道DATASET或DATATABLE是脱离数据库存在的,不会和数据库同步更新!如果需要后台数据库与DataList的DataSource(即DATASET或DATASET)同步更新,需两边都更新!DataList的DataSource是一直通过ViewStatus保留内存,需通过DataRowView.BeginEdit()或editRow.Delete()方法更新,而后台数据库通过OleDbDataAdapter.Update()方法更新。
OleDbConnection→OleDbDataAdapter→DataTable或DataSet→DataView→DataRowView
private void MenuList_UpdateCommand(object sender, DataListCommandEventArgs e)
{
TextBox MenuID = (TextBox)e.Item.FindControl("MenuID");
TextBox MenuName = (TextBox)e.Item.FindControl("MenuName");
TextBox MenuURL = (TextBox)e.Item.FindControl("MenuURL");
TextBox MenuRemark = (TextBox)e.Item.FindControl("MenuRemark");
sql = "UPDATE DICTDATA SET [NAME]='"+Pub.FormatSQL(MenuName.Text)+"',[URL]='"+Pub.FormatSQL(MenuURL.Text)+"',[Remark]='"+Pub.FormatSQL(MenuRemark.Text)+"' where [ID]="+MenuID.Text.Trim();
try
{
//更新DataTable
DataRowView[] findRow = DataView1.FindRows(MenuID.Text.Trim());
if (findRow.Length == 1)
{
DataRowView editRow = findRow[0];
editRow.BeginEdit();
editRow["Name"] = MenuName.Text.Trim();
editRow["URL"] = MenuURL.Text.Trim();
editRow["Remark"] = MenuRemark.Text.Trim();
editRow.EndEdit();
}
//更新后台数据库
OleDbCommand updateCommand = new OleDbCommand(sql,Pub.OleDbConnection1);
DataAdapter1.UpdateCommand = updateCommand;
DataAdapter1.Update(DataTable1);
//重新绑定DataList的DataSource
MenuList.EditItemIndex = -1;
BindList();
}
catch (Exception ex)
{
this.MsgText.Text = "菜单:"+MenuName.Text.Trim()+" 更新失败,请重试!";
}
finally
{
this.MsgText.Text = "菜单:" + MenuName.Text.Trim() + " 更新成功!";
}
}
注明:通过Response.Redirect("admin_menu.aspx")等类似方法会增加IIS服务器的负荷,不可取,而且我在本机也没测试成功过!Top




