图片数组:Image[] img = new Image[100];
给图片赋值(配图):
for (int i = 0; i < 20; i++)
{
img[i] = (Image)Bitmap.FromFile("Images0//" + (i + 1).ToString() + ".bmp");
}
画图:
private void Draw(Graphics g, Image scrImg, int PicX, int PicY)
{
g.DrawImage(scrImg, new Point(PicX, PicY));
}
private void Form1_Paint(object sender, EventArgs e)
{
g_g = this.CreateGraphics();
}
Draw(g_g, back[0], 0, 0);
Random r = new Random();
k = r.Next(15);
画壁画刷:
Brush br = new SolidBrush(this.BackColor);
g_g.FillRectangle(new SolidBrush(this.BackColor), new Rectangle(0, 0, 800, 800));//画刷填涂
g_g.DrawRectangle(br, new Rectangle(coutx * 33, couty * 35, 33, 35));
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "文本文件|*.txt|所有文件|*.*";
if (ofd.ShowDialog() == DialogResult.OK)
class Music
{
[DllImport("winmm.dll")]
private static extern int mciSendString
(
string lpstrCommand,
string lpstrReturnString,
int uReturnLength,
int hwndCallback
);
[DllImport("kernel32.dll", CharSet = CharSet.Auto)]
public static extern int GetShortPathName
(
[MarshalAs(UnmanagedType.LPTStr)] string path,
[MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,
int shortPathLength
);
public void Play(string FileName)
{
StringBuilder shortPathTemp = new StringBuilder(255);
int result = GetShortPathName(FileName, shortPathTemp, shortPathTemp.Capacity);
string ShortPath = shortPathTemp.ToString();
mciSendString("open " + ShortPath + " alias song", "", 0, 0);
mciSendString("play song", "", 0, 0);
}
public void Stop()
{
mciSendString("stop song", "", 0, 0);
}
public void Pause()
{
mciSendString("pause song", "", 0, 0);
}
public void Close()
{
mciSendString("close song", "", 0, 0);
}
}
用法:
public Music music = new Music();
music.Play("Sounds//bg-01.mid");
public enum Direction
{
None = 0,
East = 1,
South = 2,
West = 4,
North = 3,
Middle = 5,
}
用法:
Direction d = new Direction();
d=Direction.East;
int i=1;
d=( Direction)i;
视图----任务列表
//TODO:
通过TODO:可以增加标签,以便迅速找到该位置。同时如果有位置可扩展功能也可做标签。如上图,如果让胜利的图样炫一点,只要点那个标签便可找到那个位置加以增加
在构造函数设置其皮肤文件即可
写文件
StreamWriter writer = null;
string filepath = "gate.dat";
if (File.Exists(filepath))
{
File.Delete(filepath);
writer = File.CreateText(filepath);
}
else
{
writer = File.CreateText(filepath);
}
writer.WriteLine("嘎嘎,写成功了");
writer.Close();
读文件
StreamReader sr = new StreamReader("gate.dat");
String line = "";
line = sr.ReadLine();//可以用for循环读取的
sr.Close();
添加---新建项
2.在app.config中增加
<connectionStrings>
<add name="constr" connectionString="server=CSE-HUAIYAO;database=test; integrated security=true" providerName="System.Data.SqlClient"/>
connectionStrings>
其中 name表示名称,用于使用时索引。 connectionString为数据库连接字符串。providerName为
所在命名空间,此为确定项。
3 在要引用该连接字符串的项目下添加引用
在用该字符串的文件中添加引用
using System.Configuration;
4 该字符串的使用:
string s = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
配置文件webform下是web.config,winform下是app.config,如果要加密app.config,先把它改名为:web.config,加密后再重新改回原名就可以了
打开SDK命令提示执行以下命令:
加密:aspnet_regiis -pef "配置节" "目录"
解密:aspnet_regiis -pdf "配置节" "目录"
如:aspnet_regiis -pef "connectionStrings" "e:/TestProject"
加密e:/TestProject/web.config中设置的connectionStrings节点中的内容
读取节点值和未加密前相同,.net会自动解密
private void UpdateConfig(string Xvalue){ XmlDocument doc = new XmlDocument();
doc.Load(Application.ExecutablePath + ".config");
XmlNode node = doc.SelectSingleNode(@"//add[@name='constr']");
XmlElement ele = (XmlElement)node;
ele.SetAttribute("connectionString", Xvalue);
doc.Save(Application.ExecutablePath + ".config");}
http://blog.myspace.cn/e/404297451.htm
ASP.NET概述
1、ASP.NET
ASP.NET是微软流行的动态WEB编程技术活动服务器网页(ASP)的最新版本,但它远不是传统ASP简单升级。ASP.NET和ASP的最大区别在于编程思维的转换,ASP.NET是真正的面向对象(Object-oriented),而不仅仅在于功能的增强。
在ASP.NET中,Web 窗体页由两部分组成:视觉元素(HTML、服务器控件和静态文本)和该页的编程逻辑。其中每一部分都存储在一个单独的文件中。可视元素在一个扩展名为 .aspx 文件中创建,而代码位于一个单独的类文件中,该文件称作代码隐藏类文件扩展名为.aspx.vb 或 .aspx.cs。这样,.aspx文件中存放所有要显示的元素,aspx.vb或.aspx.cs文件中存放逻辑。
2、用户控件(UserControl)
为了使用户能够根据需要方便地定义控件,ASP.NET引入了 Web 窗体用户控件的概念。实际上,只要将.aspx稍作修改即可转换为 Web 用户控件,扩展名为 .ascx,.ascx和.aspx文件一样也有一个存放逻辑的代码隐藏类文件,扩展名为.ascx.vb或.ascx.cs,只是它不能作为独立 Web 窗体页来运行,只有当被包含在 .aspx文件中时,用户控件才能工作。
通过以下两个步骤在WEB窗体页中设置用户控件:
(1)使用@ Register指令在.aspx文件中注册用户控件。如要注册在放在相对路径"../UserControl/"下的头文件headinner.ascx的方法为:
<%@ Register TagPrefix="Acme" TagName="Head" Src="../UserControl/headinner.ascx" %>
(2)在服务器控件的开始标记和结束标记之间(<form runat=server> </form>) 声明该用户控件元素。例如要声明上面所导入的控件的语法为:
<Acme: Head runat="server"/>
这样,该控件就成为页的一部分,并将在处理该页时呈现出来。并且,该控件的公共属性、事件和方法将向 Web 窗体页公开并且可以通过编程来使用。根据这个原理,就可以将每个页面初始化时所要执行的操作(如登录验证,角色验证)封装在用户控件当中。
RBAC的基本思想
RBAC(角色访问控制)的基本思想可简单地用图1来表示,即把整个访问控制过程分成两步:访问权限与角色相关联,角色再与用户关联,从而实现了用户与访问权限的逻辑分离。
由于RBAC实现了用户与访问权限的逻辑分离,因此它极大的方便了权限管理。例如,如果一个用户的职位发生变化,只要将用户当前的角色去掉,加入代表新职务或新任务的角色即可,角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,并且委派用户到角色不需要很多技术,可以由行政管理人员来执行,而配置权限到角色的工作比较复杂,需要一定的技术,可以由专门的技术人员来承担,但是不给他们委派用户的权限,这与现实中情况正好一致。
用户权限在.NET中的设计与实现
利用.NET中的用户控件实现权限控制的基本思想是:根据角色访问控制(RBAC)的基本原理,给用户分配一个角色,每个角色对应一些权限,然后利用ASP.NET中的用户控件(UserControl)来判断该用户对应的角色是否对访问页面有访问的权力。
下面将从数据库设计、添加角色和用户控件的使用等三方面来阐述具体实现过程。
1、数据库中表的设计
首先,在数据库中设计功能模块表、功能表和角色表等三个表。
(1) 功能模块表
为了管理好用户的权限,首先要组织好系统的模块,为此设计了一个功能模块表。见表1。
(2) 功能表
每个功能模块所具有的子功能称为功能,如商品管理模块goods(属于功能模块的范畴)包含商品信息查询、商品信息更新、商品信息删除、商品定价信息查询以及商品定价信息更新五种功能,功能表的设计见表2。
上面提到的例子可以作为这样几条记录分别插入功能模块表和功能表。
insert into TModule values(0,///'商品管理模块///',///'goods//',5);insert into Tfunction values(0,//'商品信息查询//',///'selectgoods',0);insert into Tfunction values(1,///'商品信息更新///',///'updategoods//',0);insert into Tfunction values(2,/'商品信息删除///',/'deletegoods',0);insert into Tfunction values(3,//'商品定价信息查询///',//'selectgoodsprice///',0);insert into Tfunction values(4,/'商品定价信息更新///','updategoodsprice///',0);
(3) 角色表
角色表的设计关键在于角色值的定义,它是一个由0和1组成的类似二进制数的字符串。而功能表中的funcNo (功能编号)字段表示该功能在角色表的roleValue (角色值)字段中的位置,如果该位置对应的数值是0,表示该角色无此权限,如果值为1,则表示该角色拥有此权限。如角色普通会员的角色值为100100…00(共100位),如上所示,商品信息查询的功能编号为0,角色值100100…00的第0位为1,所以该普通会员角色拥有商品信息查询的功能;相反,该角色值的第1位为0,而功能编号为1 的功能为商品信息更新,所以该普通会员角色没有商品信息更新的权限。它们的关系可由图2来表示。
2、角色的添加
有了上面几个表,角色页面的功能模块以及其对应的功能都可以从功能模块表和功能表中读出,如图3所示。
在将新角色普通会员插入数据库时,先将角色值的所有位都置为0,然后利用.NET Framework 类库中的Replace函数将角色值中的打上勾的功能相应的功能编号位的值改为1。
例如,新添加一个角色名为普通会员的角色,它拥有的功能为商品信息查询(功能编号0)和商品定价信息查询(功能编号3)两项,则角色值应为1001000……00(100位),即角色值中第0位和第3位的值为1,其余为0。
3、利用用户控件实现访问权限
在定义好用户控件.ascx文件(head.ascx)及.ascx.cs(head.ascx,cs)文件时,接下去只要在.aspx文件中注册和声明它就可以了。
(1) 注册
<%@ Register TagPrefix="Acme" TagName="Head" Src="../UserControl/headinner.ascx" %>
(2) 声明
经过实践,在.aspx文件中声明.ascx文件可分为几种情况:
第一种情况:<Acme:Head runat="server" />
第二种情况:<Acme:Head runat="server" flag=0 funcname1=selectgoods funcname2=updategoods />
第三种情况:<Acme: Head runat="server" flag=1 funcname1= selectgoods funcname2=updategoods />
字段flag是用来控制怎样进行权限检查的标志,funcname指功能表中的功能英文名。如果flag为空,则不执行权限检查(第一种情况);否则如果flag=="0",则表示同时具有selectgoods(商品信息查询)和 updategoods(商品信息更新)这两种权限的角色所对应的用户才有权利查看该页(第二种情况);否则,如果flag=="1",则认为,具有selectgoods(商品信息查询)或 updategoods(商品信息更新)这两种权限中任意一种权限的用户就有权利查看该页(第三种情况)。
上面进行权限检查的过程全部由用户控件来实现,其全部方法都封装在.ascx.cs文件中,其中最主要的一个方法是检查某一角色是否拥有某一确定权限的checkAuth(string roleId,string funcEName)方法。这个方法的思想如图4所示。
图4中roleValue(角色值)的第0位(selectgoods的功能编号)值为1,表示该角色拥有selectgoods(商品信息查询)的权限。这样,我们把对权限检查的所有逻辑都封装在了用户控件中,因此,对WEB窗体页.aspx文件而言,只需在导入.ascx文件时确定用户在访问该页面时所应拥有的权限,而不需对aspx.cs进行任何改动。
由上所述,可以很清楚地看出,只要在用户控件中对用户权限进行控制,再把它包括在.aspx文件中(这件事作者本来就是要做的),那么在编程的时候就不必考虑复杂的权限问题了。
问题
我用的是asp.net c#开发的bs系统。同一篇word做的公文要流转到不同的部门,每个部门只能填写修改本部门在这篇公文里指定区域的内容,不能动其他部门的内容,又要能看到其他部门的内容。这就是客户的要求,还要去必须在word里做。不能用其他变通的方法!请高手给点思路
实现方法:
假设用户UserA只能编辑公文test.doc中的a区域,用户UserB只能编辑test.doc中的b区域。
首先打开test.doc文档,选择a区域,添加书签,命名为SOA_a;选择b区域,添加书签,命名为SOA_b。为避免和用户其他书签名称冲突,在SOAOffice里数据区域名称都是以SOA_为前缀的书签名称。保存test.doc。
新建EditWord.aspx页面,在Page_Load里编写代码:
private void Page_Load(object sender, System.EventArgs e) { // 在此处放置用户代码以初始化页面 if(Session["UserName"]==null) Response.Redirect("Index.aspx"); string strUserName = Session["UserName"].ToString(); string strDataRegion = "a";
//----------- SOAOFFICE 服务器端编程开始 -------------------// // 首先确保引用SOAOFFICE中间件的服务器端.NET组件SOAOfficeX // SOAOfficeX.dll 在本示例代码的 bin 文件夹下 SOAOfficeX.WordResponse SOAWord = new SOAOfficeX.WordResponse(); SOAWord.FormMode = true; SOAWord.DisableWindowRightClick = true;//禁止Word右键菜单
if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b";
SOAOfficeX.IWordResDataRegion dataRegion = SOAWord.OpenDataRegion(strDataRegion); dataRegion.NeedSubmit = true;
SOAOfficeX.SOAOfficeCtrl SOACtrl = new SOAOfficeX.SOAOfficeCtrl(); // 设置连接SOAOFFICE中间件服务器端SOAServer的参数 SOACtrl.Server = Request.ServerVariables["HTTP_HOST"]; SOACtrl.ServerPort = "4357"; // 设置界面样式 SOACtrl.MainStyle = SOAOfficeX.soaMainStyle.VistaBlue; SOACtrl.Caption = "填写文档内容,并提交填写的内容到服务器数据库。"; SOACtrl.BorderStyle = SOAOfficeX.soaBorderStyle.BorderNone; SOACtrl.Toolbars = false; SOACtrl.Menubar = false; // 设置保存文档的服务器页面 SOACtrl.SaveDataURL = "SaveData.aspx"; // 获取数据对象 SOACtrl.Assign(SOAWord); // 打开文档 SOACtrl.WebOpen("doc/test.doc", SOAOfficeX.soaWorkMode.docReadOnly, strUserName, "Word.Document"); //----------- SOAOFFICE 服务器端编程结束 -------------------// }
其中关键代码是:
if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b";
SOAOfficeX.IWordResDataRegion dataRegion = SOAWord.OpenDataRegion(strDataRegion); dataRegion.NeedSubmit = true;
判断当前登录用户,OpenDataRegion指定当前可编辑提交的文本区域。
创建SaveData.aspx页面,用来保存用户的输入内容,保存到数据库。在Page_Load里编写代码: { // 在此处放置用户代码以初始化页面 //----------- SOAOFFICE 服务器端编程开始 -------------------// SOAOfficeX.WordRequest SOAWord = new SOAOfficeX.WordRequest(); if(Session["UserName"]==null) { Label1.Text = "保存失败!登录用户无效。"; SOAWord.ShowPage(580,270); return; } string strUserName = Session["UserName"].ToString(); string strDataRegion = "a";
if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b";
Label1.Text = "当前登录用户是:" +strUserName+ ""; if(SOAWord.OpenDataRegion(strDataRegion).value=="") { Label1.Text = Label1.Text + "请填写工作进度。"; SOAWord.ShowPage(580,270); return; }
Label1.Text = Label1.Text + "保存成功!"; Label1.Text = Label1.Text + "保存内容如下:" + SOAWord.OpenDataRegion(strDataRegion).value; SOAWord.ShowPage(580,270); SOAWord.ReturnOK();//此句是必须的,向SOAOffice客户端控件返回保存成功消息。 //----------- SOAOFFICE 服务器端编程结束 -------------------// }
其中关键代码是:
if(strUserName == "UserA") strDataRegion = "a"; else if(strUserName == "UserB") strDataRegion = "b";
Label1.Text = Label1.Text + "保存内容如下:" + SOAWord.OpenDataRegion(strDataRegion).value;
判断当前登录用户,OpenDataRegion获取当前提交的文本区域内容。这里并没有提供代码保存到数据库,而是把取到的值在客户端触发信息窗口显示出来。如何把这个字符串保存到数据库相信读者都会写,不是本文讨论的重点,这里重点显示了如何取Word文档中指定区域的文本。
实现代码是不是很简单?本文完整的示例代码请下载:
http://www.kehansoft.com/web/shared/democode/word_editarea.rar
示例代码在VS.Net2003下编译调试通过。如果你的开发环境是VS.Net2005或VS.Net2008,那么创建一个工程,拷贝示例代码中的代码即可。
//将?word内¨²容¨Y写¡ä进?数ºy据Y库a
private void button1_Click(object sender, EventArgs e)
{
SqlConnection sqlConn = new SqlConnection();
sqlConn.ConnectionString = @"server=HUAIYAO;database=test; integrated security=true";
sqlConn.Open();
FileInfo fi = new FileInfo("1.doc");
if (fi.Exists)
{
byte[] bData = null;
using (FileStream fs = fi.OpenRead())
{
bData = new byte[fi.Length];
int nReadLength = fs.Read(bData, 0, (int)(fi.Length));
}
string strQuery = "INSERT INTO FileInfo "
+ " ( FileName, FileData ) "
+ " VALUES "
+ " ('1', @FileData ) ";
SqlCommand sqlComm = new SqlCommand(strQuery, sqlConn);
SqlParameter myParm = sqlComm.Parameters.Add("@FileData", SqlDbType.Image);
myParm.Value = bData;
int i = sqlComm.ExecuteNonQuery();
MessageBox.Show("插?入¨?成¨¦功|");
sqlComm.Dispose();
}
}
//将?数ºy据Y库a内¨²容¨Y写¡ä入¨?word文?件t
private void button2_Click(object sender, EventArgs e)
{
string strFullName = "2.doc";
string strQuery = "SELECT FileData FROM FileInfo where FileName = '1'";
SqlConnection sqlConn = new SqlConnection();
sqlConn.ConnectionString = @"server=HUAIYAO;database=test; integrated security=true";
sqlConn.Open();
SqlDataAdapter sqlDAdapter = new SqlDataAdapter(strQuery, sqlConn);
DataSet sqlRecordSet = new DataSet();
byte[] bData = null;
try
{
sqlDAdapter.Fill(sqlRecordSet, "FileInfo");
foreach (DataRow dr in sqlRecordSet.Tables["FileInfo"].Rows)
{
if (dr["FileData"] != DBNull.Value)
bData = (byte[])dr["FileData"];
}
}
catch (SqlException sqlErr)
{
MessageBox.Show(sqlErr.Message);
}
catch
{
MessageBox.Show("Failed to read data from DB!");
}
sqlRecordSet.Dispose();
sqlDAdapter.Dispose();
if (bData != null)
{
// Save file
FileInfo fi = new FileInfo(strFullName);
if (!fi.Exists)
{
using (FileStream fs = fi.Create())
{
fs.Write(bData, 0, bData.Length);
}
}
else
{
using (FileStream fs = fi.OpenWrite())
{
fs.Write(bData, 0, bData.Length);
}
}
}
}
通过存储过程用循环语句判断不及格科目
create table coursegrade
(
id int identity(1,1),
sno varchar(20),
sname varchar(10),
coursename varchar(20),
grade numeric(10,2)
)
insert into coursegrade values('123012008007','槐尧','软件工程',88.5)
insert into coursegrade values('123012008007','槐尧','数据结构',90)
insert into coursegrade values('123012008007','槐尧','linux',55)
delete from coursegrade where id=2
select * from coursegrade
CREATE PROC selnotpass
AS
BEGIN
SELECT * FROM COURSEGRADE WHERE grade<60
END
exec selnotpass
drop PROC selnotpassno
CREATE PROC selnotpassno
AS
BEGIN
declare @num int
declare @max int
declare @i int
declare @grade numeric(10,2)
select @i=min(id) from coursegrade
select @max=max(id) from coursegrade
set @num=0
while @i<=@max
begin
select @grade=grade from coursegrade where id=@i
if exists (select * from coursegrade where id=@i) and @grade<60
begin
print @grade
set @i=@i+1
set @num=@num+1
end
else
set @i=@i+1
end
print @num
END
exec selnotpassno
注:create proc [名字]之后,As之前可以定义存储过程参数
Begin之后开始进行要执行的操作,begin要与end配对好
声明变量 declare @num int
对变量赋表格里面的值要用select语句
While 语句begin开始循环。End结束 ,判断语句在while后面不用加括号
if exists (select * from coursegrade where id=@i) 判断选择语句之中是否有内容,if语句用and,or表示与或 if语句begin开始 end结束
对变量赋值赋值要用set set @i=@i+1
begin try
begin tran
delete dbo.AritcleList where WritterID in(select WritterID from dbo.AritcleList group by WritterID having count(*)<5)
delete dbo.UserInfo where UserCode =1
commit tran
end try
begin catch
rollback tran
end catch
//删除文章数小于5的作者及其文章
protected void btdel_Click(object sender, EventArgs e)
{
string str = "server=HUAIYAO;database=AdoDemo; integrated security=true";
conn = new SqlConnection(str);
conn.Open();
string sql = "select * from UserInfo";
SqlCommand cmd = new SqlCommand(sql, conn);
//或者作者信息
SqlDataAdapter sda = null;
DataSet ds = null;
using (sda = new SqlDataAdapter(cmd))
{
ds = new DataSet();
sda.Fill(ds);
}
//创建事务
SqlTransaction myTran = conn.BeginTransaction() ;
try
{
SqlCommand delcmd = new SqlCommand();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
delcmd.Connection = conn;
delcmd.Transaction = myTran; //将delcmd绑定到事务中
string writterid = ds.Tables[0].Rows[i][0].ToString();
delcmd.CommandText = "select count(*) from dbo.AritcleList where WritterID=" + writterid;
int num = Convert.ToInt32(delcmd.ExecuteScalar());
//判断该作者的文章数是否小于5
if (num <= 5)
{
delcmd.CommandText = "delete dbo.AritcleList where WritterID=" + writterid;
delcmd.ExecuteNonQuery();
delcmd.CommandText = "delete dbo.UserInfo where UserCode=" + writterid;
delcmd.ExecuteNonQuery();
}
}
//提交事务
myTran.Commit();
}
catch (Exception err)
{
Response.Write(err.Message);
//回滚
myTran.Rollback();
}
finally
{
conn.Close();
}
}
create proc selpassnot
AS
BEGIN
declare @i int
declare @grade numeric(10,2)
declare @num int
set @num=0
declare cursor1 cursor for --定义游标
select id,grade from coursegrade ----使用游标的对象(跟据需要填入select文)
open cursor1 --打开游标
fetch next from cursor1 into @i,@grade --将游标向下移行,获取的数据放入之前定义的变量@i,@grade中
while @@fetch_status=0 --判断是否成功获取数据
begin
if @grade<60
begin
set @num=@num+1;
end
fetch next from cursor1 into @i,@grade
end
close cursor1 --关闭游标
deallocate cursor1 --释放
print @num
END
asp.net 网页传参的几种常用方式
第一种:QueryString
//将源页面start.aspx中的lable 和textbox中的内容传到end.aspx页面中 并在其lable 和textbox中显示传过来的内容
源页面代码:
protected void Button1_Click(object sender, EventArgs e) { string url; url = "end.aspx?name="+Label1.Text+"&home="+TextBox1.Text; Response.Redirect(url); }
目标页代码:
protected void Page_Load(object sender, EventArgs e) { ///通过QueryString传参数 Label1.Text = Request.QueryString["name"]; TextBox1.Text=Request.QueryString["home"];
}
第二种:通过Session传参数
源页面代码:
protected void Button1_Click(object sender, EventArgs e) { Session["name"]=Label1.Text; Session["home"] = TextBox1.Text; Server.Transfer("end.aspx"); }
目标页代码:
protected void Page_Load(object sender, EventArgs e) { //通过Session传参数 Label1.Text=Session["name"].ToString(); TextBox1.Text = Session["home"].ToString(); //应该使用一些清理动作来去除一些不需要的session来降低资源的无谓消耗.
Session.Remove("name"); Session.Remove("home");
}
第三种:使用Server.Transfer传参数
该方法虽然麻烦,但是你可以在另一个页面以对象属性的方式来存取显露的值。
原页面代码:
public partial class start: System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) {
} protected void Button1_Click(object sender, EventArgs e) { //使用Server.Transfer方法 Server.Transfer("end.aspx"); }
//此处设定变量name和home的返回值,以便在目标页面中作为属性值显示 public string name { get { return Label1.Text; } } public string home { get { return TextBox1.Text; } }
}
目标页代码:
public partial class end : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) {
//此处把目标页面_Default作为一个类,而name和home都为其属性值 start wf1; wf1 = (start)Context.Handler; Label1.Text = wf1.name; TextBox1.Text = wf1.home;
}}
不刷新页面的弹出:(插入到 后面,故先刷新再弹出的) Page.RegisterStartupScript("","<script>alert('您并未进行任何选择,请点编号前的复选框进行选择!')</script>"); 注: //刷新父窗口的父窗口 Dim strScript As String = "<script Language='VBScript'>" & vbCrLf strScript &= "opener.parent.document.location.href=""" & "../Individual/UserJobs.aspx EntityTableID=" & Request("EntityTableID") & "&ListID=" & BLL.TableType.Entity & "&OrgID=" & Request("OrgID") & "&TableID=" & oRightGroupAccessTableView.TemplateTable.TableID & IIf(Request("RecordID") Is Nothing, "", "&RecordID=" & Request("RecordID")) & """" & vbCrLf strScript &= "</script>" & vbCrLf Response.Write(strScript) //关闭,父窗口弹出对话框,子窗口直接关闭 this.Response.Write("<script language=javascript>window.close();</script>"); //关闭,父窗口和子窗口都不弹出对话框,直接关闭 this.Response.Write("<script>"); this.Response.Write("{top.opener =null;top.close();}"); this.Response.Write("</script>"); //弹出窗口刷新当前页面width=200 height=200菜单。菜单栏,工具条,地址栏,状态栏全没有 this.Response.Write("<script language=javascript>window.open('rows.aspx','newwindow','width=200,height=200')</script>"); //弹出窗口刷新当前页面 this.Response.Write("<script language=javascript>window.open('rows.aspx')</script>"); this.Response.Write("<script>window.open('WebForm2.aspx','_blank');</script>"); //弹出提示窗口跳到webform2.aspx页(在一个IE窗口中) this.Response.Write(" <script language=javascript>alert('注册成功');window.window.location.href='WebForm2.aspx';</script> "); //关闭当前子窗口,刷新父窗口 this.Response.Write("<script>window.opener.location.href=window.opener.location.href;window.close();</script>"); this.Response.Write("<script>window.opener.location.replace(window.opener.document.referrer);window.close();</script>"); //子窗口刷新父窗口 this.Response.Write("<script>window.opener.location.href=window.opener.location.href;</script>"); this.Response.Write("<script>window.opener.location.href='WebForm1.aspx';</script>"); //弹出提示窗口.确定后弹出子窗口(WebForm2.aspx) this.Response.Write("<script language='javascript'>alert('发表成功!');window.open('WebForm2.aspx')</script>"); //弹出提示窗口,确定后,刷新父窗口 this.Response.Write("<script>alert('发表成功!');window.opener.location.href=window.opener.location.href;</script>"); //弹出相同的一页 "button" value="Button" οnclick="javascript:window.open(window.location.href)"> // Response.Write("parent.mainFrameBottom.location.href='yourwebform.aspx temp=" +str+"';"); <script LANGUAGE="javascript"> </script> 参数解释: <script LANGUAGE="javascript"> js脚本开始; window.open 弹出新窗口的命令; 'page.html' 弹出窗口的文件名; 'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替; height=100 窗口高度; width=400 窗口宽度; top=0 窗口距离屏幕上方的象素值; left=0 窗口距离屏幕左侧的象素值; toolbar=no 是否显示工具栏,yes为显示; menubar,scrollbars 表示菜单栏和滚动栏。 resizable=no 是否允许改变窗口大小,yes为允许; location=no 是否显示地址栏,yes为允许; status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许; </script> js脚本结束 'newwin':隐藏菜单栏地址栏工具条 width=50:宽度 height=50:高度 scrollbars=yes/no:滚动条 top=50:窗口距离屏幕上方 left=50:窗口距离屏幕左侧 例:window.open('detail.aspx ID="+e.Item.Cells[1].Text+"','newwin','width=750,height=600,scrollbars=yes,top=50,left=50');"); this.Response.Write("<script>window.open('WebForm2.aspx','','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=750,height=470,left=80,top=40');</script>"); 例: this.Response.Write("<script>alert('发表成功!');window.opener.location.href=window.opener.location.href;</script>"); this.Response.Write("<script>"); this.Response.Write("{top.opener =null;top.close();}"); this.Response.Write("</script>"); 例: linkcolumn1.DataNavigateUrlFormatString="javascript:varwin=window.open('edit_usr.aspx actid={0}','newwin','width=750,height=600,scrollbars=yes,top=50,left=50');window.close()";
将关联的checkbox的name取相同名称chk
<input type="checkbox" value="<%#Eval("id") %>" name="chk"/>
<input type="checkbox" id="all" onclick="selectAll(this);"/>
<script type="text/javascript">
function selectAll(obj) {
var chks = document.getElementsByName("chk");
for (var i = 0; i < chks.length; i++) {
chks[i].checked = obj.checked;
}
}
script>
把AspNetPagerdll的dll文件加进去
下载地址:http://www.webdiyer.com/
客户端
<webdiyer:AspNetPager ID="AspNetPager1" runat="server" OnPageChanged="AspNetPager1_PageChanged"
CustomInfoHTML="当前页:%CurrentPageIndex% 总页数:%PageCount% 显示第%StartRecordIndex%条到%EndRecordIndex%条记录"
ShowCustomInfoSection="left" CssClass="pages" CurrentPageButtonClass="cpb" UrlPaging="true">
webdiyer:AspNetPager>
UrlPaging="true"为允许url方式访问
对应的Css样式:
<style type="text/css">
.pages
{
color: #999;
}
.pages a, .pages .cpb
{
text-decoration: none;
float: left;
padding: 0 5px;
border: 1px solid #ddd;
background: #ffff;
margin: 0 2px;
font-size: 11px;
color: #000;
}
.pages a:hover
{
background-color: #E61636;
color: #fff;
border: 1px solid #E61636;
text-decoration: none;
}
.pages .cpb
{
font-weight: bold;
color: #fff;
background: #E61636;
border: 1px solid #E61636;
}
style>
后台代码
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
GetData();
}
}
protected void GetData()
{
string s = "select * from dbo.CustomersInfo";
DataSet ds = new DataSet();
ds = SQLServerHelper.ExecuteDataset(constr, CommandType.Text, s);
PagedDataSource pds = new PagedDataSource();
pds.DataSource = ds.Tables[0].DefaultView;
pds.PageSize = 10;//每页10个记录
pds.AllowPaging = true;//允许分页
AspNetPager1.RecordCount = ds.Tables[0].DefaultView.Count;
pds.CurrentPageIndex = AspNetPager1.CurrentPageIndex - 1;
Repeater1.DataSource = pds;
Repeater1.DataBind();
}
foreach (RepeaterItem item in this.Repeater1.Items)
{
LinkButton linkbt = (LinkButton)(item.FindControl("lbtUpdate"));
linkbt.Enabled = false;
}
ClientScript.RegisterClientScriptBlock(this.GetType(), "this", "<script>alert('密码错误');</script>");
前台
<div id="power" runat="Server">
div>
方法1
HtmlInputCheckBox checktitle = new HtmlInputCheckBox();
checktitle.ID = "ck"; //设置id
checktitle.Attributes.Add("name", "jdkhsjk"); //添加属性
//新加div其属性也可类似上面加入
HtmlGenericControl divtitle = new HtmlGenericControl("div");
HtmlGenericControl hh1 = new HtmlGenericControl("span");
hh1.InnerText = "男";
power.Controls.Add(divtitle);//将新建的div加入到power div中
power.Controls.Add(checktitle);
divtitle.Controls.Add(hh1);
方法2
string checkid = "ck";
string checkname = "ckname";
Literal checktitle = new Literal();
checktitle.Text = " + checkid + "/" name=/"" + checkname + "/" type=/"checkbox/" οnclick=/"selectAll(this)/">";
power.Controls.Add(checktitle);
JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧。 JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的API或工具包。
JSON的规则很简单:对象是一个无序的"'名称/值'对"集合。一个对象以"{"(左括号)开始,"}"(右括号)结束。每个"名称"后跟一个":"(冒号);"'名称/值' 对"之间使用","(逗号)分隔。具体细节参考http://www.json.org/json-zh.html
举例:A: [{"name": "zhangsan"}]
B: [{"name": "zhangsan", "sex": "man"}]
C: [{"name": "zhangsan", "sex": "man"},{"name": "lili", "sex": "woman"}]
里面的每一个中扩号里面的都是一项.对于C这个JSON,我们可以通过 C[0].name 取出zhangsan这个字段, C[1].sex取出lili及第二项所对应的sex "woman"
通过这种方式,我们能够很容易的将数据库的各个字段的值一起传到页面去。在此我用mvc2 架构展示一下。所用数据库如下:
在此我只简单的演示用法,至于页面效果等就不做精美设计。页面很简单,只是点击button按钮,来显示出第二项的powername和powerCnName.
View 层如下:
<head runat="server">
<title>Test title>
<script src="../../Scripts/jquery-1.4.1.js" type="text/javascript"> script>
head>
<body>
<div>
权限:<input type="text" id="name" /><br />
中文名:<input type="text" id="cname" /><br />
<input type="button" id="show" value="显示第二项" />
div>
<script type="text/javascript">
$(document).ready(function() {
$("#show").click(function getDate() {
$.ajax({
url: "GetPower",
type: "post",
datatype: "json",
success: getdataresult
});
});
function getdataresult(data) {
$("#name").val(data[1].name);
$("#cname").val(data[1].Chinesename);
}
});
script>
body>
Model层建了一个名叫Power类,专门负责读数据
public class Power
{
CRMDataContext db = new CRMDataContext();
public List<CRM_Power> GetAllPowers()
{
return db.CRM_Power.ToList();
}
}
Controller层主要是为Ajax调用JSON写一个action
public ActionResult Test()
{
return View();
}
public ActionResult GetPower()
{
Power p=new Power();
var powers = p.GetAllPowers();
ArrayList list = new ArrayList();
foreach (var s in powers)
{
Hashtable ha = new Hashtable();
ha.Add("name", s.PowerName);
ha.Add("Chinesename", s.PowerCnName);
list.Add(ha);
}
return this.Json(list);
}
页面效果如下,如果用firebug调试,还可以发现页面相应如下