yunxizfj

等待...

导航

[小技术应用]框架下动态调用用户控件的模态弹出窗体

主要原理:是通过js的方法showModalDialog来实现的,2个窗体页面之间使用的是Session传递,在主窗体页面上放置一个隐藏的按钮。

 

<asp:LinkButton ID="LinkButton1" runat="server" style="display:none">刷新</asp:LinkButton>

 

在后台CS文件调用方法打开模式窗体,所以写一个简单的类,如下:

 

public class ModalPage
{
    
private static string ModalWindow(string openAspxPage, int width, int height)
    {
        
string js = string.Format("javascript:window.showModalDialog(\"{0}\",window,\"status:false;dialogWidth:{1}px;dialogHeight:{2}px\");javascript:__doPostBack('LinkButton1','');", openAspxPage, width, height);//window.location.href=window.location.href
        return js;
    }
    
private static void RegisterJavaScript(Page p, string js)
    {
        p.RegisterStartupScript(
"""<script>" + js + "</script>");
    }
    
private static void RegisterJavaScript(UpdatePanel up, string js, bool b)
    {
        ScriptManager.RegisterStartupScript(up, up.GetType(), 
"", js, true);
    }
    
/// <summary>
    
/// 显示模态窗体
    
/// </summary>
    
/// <param name="page">包含的模态页面</param>
    
/// <param name="width"></param>
    
/// <param name="height"></param>
    
/// <param name="p">主窗体</param>
    public static void ShowDialog(string page, int width, int height, Page p)
    {
        
string js = ModalWindow(page, width, height);
        RegisterJavaScript(p, js);
    }
    
public static void ShowDialog(string page, int width, int height, UpdatePanel up)
    {
        
string js = ModalWindow(page, width, height);
        RegisterJavaScript(up, js, 
true);
    }
}

 

在模式窗体页面做一些你想要的操作,比如:输入一些值,通过session传递对象,例如:

 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class frame_modal : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
if (!IsPostBack)
        {
            Title 
=Server.UrlDecode( Request.QueryString["t"].ToString());
            Label1.Text 
= Server.UrlDecode(Request.QueryString["s"].ToString());
            
string s = Request.QueryString["c"].ToString();
            UserControl user 
= (UserControl)LoadControl("../UserControls/" + s);
            Page.Controls.Add(user);
        }
    }
    
protected void Button1_Click(object sender, EventArgs e)
    {
        Save s 
= new Save();
        s.Value1 
= TextBox1.Text;
        s.Value2 
= TextBox2.Text;
        Session[
"s"= (object)s;
        Response.Write(
"<script>window.opener=null;window.close();</script>");
    }
}

 

然后是在主窗体页面,因为是通过javascript:__doPostBack('LinkButton1','');这句实现的刷新方法,所以在主窗体load事件中处理传递来的值,如下:

 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class frame_main : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
if (!IsPostBack)
        {
        }
        
else
        {
            
if (Session["s"!= null)
            {
                Save s 
= (Save)Session["s"];
                TextBox2.Text 
= s.Value1;
                TextBox3.Text 
= s.Value2;
            }
        }
    }
    
protected void Button1_Click(object sender, EventArgs e)
    {
        
string i1 = Server.UrlEncode("这是窗体传递的字符串");
        
string i2 = Server.UrlEncode("标题:" + drp.Items[drp.SelectedIndex].Text);
        
string s = string.Format("modal.aspx?t={0}&s={1}&c={2}",i2 , i1, drp.SelectedValue);
        
//ModalPage.ShowDialog(s, 600, 400, this);
        ModalPage.ShowDialog(s, 600400, UpdatePanel1);
    }
}

 

最后就是对象的代码:

 

/// <summary>
/// Save 保存值传递的对象
/// </summary>
public class Save
{
    
private string _value1;
    
private string _value2;

    
public string Value1
    {
        
get { return _value1; }
        
set { _value1 = value; }
    }

    
public string Value2
    {
        
get { return _value2; }
        
set { _value2 = value; }
    }
    
public Save()
    {
    }
}

 

不过实验过程中,遇到了一个问题:如果把LinkButton1放到UpdatePanel1里的区域内,就无法达到刷新的效果了,再网上也没找到相应的解决方法,下面是主窗体前台代码,希望高手能出手帮忙解决下,我想实现关闭模式窗体后让UpdatePanel1里的区域内局部刷新,好像UpdatePanel1阻止了自己写的JS代码:

 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="main.aspx.cs" Inherits="frame_main" %>

<!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">
        
<asp:ScriptManager ID="ScriptManager1" runat="server">
        
</asp:ScriptManager>
        
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
            
<ContentTemplate>
                选择要打开的用户控件
                
<asp:DropDownList ID="drp" runat="server" Width="120px">
                
<asp:ListItem Value="a.ascx">测试控件a</asp:ListItem>
                
<asp:ListItem Value="b.ascx">测试控件b</asp:ListItem>
                
</asp:DropDownList>
                
<asp:Button ID="Button1" runat="server" Text="打  开" Width="80px" ToolTip="服务器Button控件" OnClick="Button1_Click" />
                
<asp:TextBox ID="TextBox1" runat="server" Text="原来的数据"></asp:TextBox>
                
<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                
<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
                
            
</ContentTemplate>
        
</asp:UpdatePanel>
    
<div>
        
        
<asp:LinkButton ID="LinkButton1" runat="server" style="display:none">刷新</asp:LinkButton>
    
</div>
    
</form>
</body>
</html>

 

源码地址:右键另存为

posted on 2009-01-05 15:17  yunxizfj  阅读(937)  评论(2编辑  收藏  举报