我把ModalPopupExtender控件和Panel控件都封装到一个自定义控件里面实现了,
然后把这个控件拖到页面上的一个div中,这个div是随竖直滚动条一起滚动的。当弹出ModalPopupExtender的面板后,这个面板不在浏览器的中间,而是跑出浏览器的可见部分了。
该如何解决这个问题,只在IE6.0下有这个问题。
以下为封装的自定义控件
namespace JamesTan.WebControls
{
using AjaxControlToolkit;
using JamesTan;
using JamesTan.Util;
using SITCAB.Common;
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
[ToolboxBitmap(typeof(DataGrid)), ToolboxData("<{0}:JamesTanBrowserExtender runat='server'></{0}:JamesTanBrowserExtender>"), Themeable(true)]
public class JamesTanBrowserExtender : CompositeControl
{
private bool allowBinding;
private bool allowSelectParameters = true;
private string breadTypeName;
private ModalPopupExtender browseModalPopupExtender = new ModalPopupExtender();
private Panel browsePanel = new Panel();
private Button cancelButton = new Button();
private Button clearButton = new Button();
private string controlToExtend;
private string[] dataFieldItems;
private string[] dataFormatStrings;
private string dataObjectTypeName;
private ObjectDataSource dataSource = new ObjectDataSource();
private bool enableSelectExXml;
private GridView GridView1 = new GridView();
private string[] gridViewDataKeyNames;
//private GridViewFilterControl gridViewFilterCtrl1 = new GridViewFilterControl();
private string[] headerTextItems;
private Button hiddenTargetControl = new Button();
private Button OkButton = new Button();
private System.Web.UI.WebControls.PlaceHolder placeHolder;
private string selectCountMethod = "SelectCount";
private string selectMethod = "Select";
private bool showClearButton = false;
private UpdatePanel UpdatePanel1 = new UpdatePanel();
private string xmlSchema = "";
public event BrowseValueSelectedEventHandler BrowseValueSelected;
public void Browse()
{
this.EnsureChildControls();
this.allowBinding = true;
this.browseModalPopupExtender.Show();
this.GridView1.DataBind();
this.GridView1.SelectedIndex = -1;
this.OkButton.Enabled = false;
}
protected void cancelButton_Click(object sender, EventArgs e)
{
this.browseModalPopupExtender.Hide();
}
protected void clearButton_Click(object sender, EventArgs e)
{
this.browseModalPopupExtender.Hide();
BrowseValueSelectedArgs args = new BrowseValueSelectedArgs(null);
if (this.BrowseValueSelected != null)
{
this.BrowseValueSelected(this, args);
}
}
protected virtual void ConfigureDataSource(ObjectDataSource ods)
{
ods.TypeName = this.breadTypeName;
ods.DataObjectTypeName = this.dataObjectTypeName;
ods.SelectMethod = this.SelectMethod;
ods.SelectCountMethod = this.SelectCountMethod;
if (!this.AllowSelectParameters)
{
ods.SelectParameters.Clear();
ods.SelectCountMethod = "";
ods.EnablePaging = false;
ods.SortParameterName = "";
this.GridView1.AllowPaging = false;
this.GridView1.AllowSorting = false;
}
if (this.EnableSelectExXml)
{
ods.SelectMethod = "SelectExXml";
ods.SelectCountMethod = "SelectExXmlCount";
ods.SelectParameters.Insert(0, new Parameter("xmlSchema", TypeCode.String, ""));
}
}
protected virtual void ConfigureGridViewColumns(GridView grid)
{
grid.Columns.Clear();
CommandField field = new CommandField();
field.ButtonType = ButtonType.Image;
field.SelectText = "Select";
field.ShowSelectButton = true;
field.SelectImageUrl = "~/images/Components/Select.gif";
grid.Columns.Add(field);
if (this.dataFieldItems.Length != this.headerTextItems.Length)
{
throw new Exception("Error setting DataFieldItems and HeaderTextItems properties.");
}
int length = this.dataFieldItems.Length;
for (int i = 0; i < length; i++)
{
BoundField field2 = new BoundField();
field2.HeaderText = this.headerTextItems[i];
field2.DataField = this.dataFieldItems[i];
field2.SortExpression = this.dataFieldItems[i];
if (this.dataFormatStrings != null)
{
if (this.dataFormatStrings.Length != this.dataFieldItems.Length)
{
throw new Exception("Error setting DataFormatStrings property.");
}
if (this.dataFormatStrings[i].StartsWith("{"))
{
field2.DataFormatString = this.dataFormatStrings[i];
field2.HtmlEncode = false;
}
}
if (this.dataFieldItems[i] == "PK")
{
field2.Visible = false;
}
grid.Columns.Add(field2);
}
grid.DataKeyNames = this.gridViewDataKeyNames;
}
protected override void CreateChildControls()
{
this.Controls.Clear();
this.CreateControlHierarchy();
this.Initialize();
base.CreateChildControls();
}
protected virtual void CreateControlHierarchy()
{
this.hiddenTargetControl.ID = "hiddenTargetControl";
this.hiddenTargetControl.Attributes["style"] = "display:none";
this.Controls.Add(this.hiddenTargetControl);
this.browsePanel.ID = "browsePanel";
this.browsePanel.Attributes["style"] = "display:none";
this.browsePanel.ScrollBars = ScrollBars.Auto;
this.browsePanel.BackColor = Color.White;
this.browsePanel.Width = Unit.Pixel(600);
this.Controls.Add(this.browsePanel);
this.UpdatePanel1.ID = "UpdatePanel1";
this.UpdatePanel1.UpdateMode = UpdatePanelUpdateMode.Conditional;
this.browsePanel.Controls.Add(this.UpdatePanel1);
//this.UpdatePanel1.ContentTemplateContainer.Controls.Add(this.gridViewFilterCtrl1);
//this.gridViewFilterCtrl1.ID = "gridViewFilterCtrl1";
//this.gridViewFilterCtrl1.EnableColumnFilter = true;
//this.gridViewFilterCtrl1.GridID = "GridView1";
//this.gridViewFilterCtrl1.DirectMode = false;
this.dataSource.ID = "dataSource";
this.dataSource.DeleteMethod = "Delete";
this.dataSource.EnablePaging = true;
this.dataSource.InsertMethod = "Create";
this.dataSource.OldValuesParameterFormatString = "original_{0}";
this.dataSource.SelectCountMethod = "SelectCount";
this.dataSource.SelectMethod = "Select";
this.dataSource.SortParameterName = "sortby";
this.dataSource.UpdateMethod = "Edit";
this.dataSource.SelectParameters.Add(new Parameter("startRowIndex", TypeCode.Int32, "0"));
this.dataSource.SelectParameters.Add(new Parameter("maximumRows", TypeCode.Int32, "10"));
this.dataSource.SelectParameters.Add(new Parameter("sortby", TypeCode.String, "{ID}"));
this.dataSource.SelectParameters.Add(new Parameter("condition", TypeCode.String));
this.UpdatePanel1.ContentTemplateContainer.Controls.Add(this.dataSource);
this.GridView1.ID = "GridView1";
this.GridView1.AllowPaging = true;
this.GridView1.AutoGenerateColumns = false;
this.GridView1.DataKeyNames = this.gridViewDataKeyNames;
this.GridView1.DataSourceID = "dataSource";
this.GridView1.Width = Unit.Percentage(100);
this.GridView1.AllowSorting = true;
this.GridView1.HorizontalAlign = HorizontalAlign.Center;
this.GridView1.AutoGenerateSelectButton = false;
this.GridView1.HeaderStyle.BackColor = Color.Gray;
this.UpdatePanel1.ContentTemplateContainer.Controls.Add(this.GridView1);
this.placeHolder = new System.Web.UI.WebControls.PlaceHolder();
this.placeHolder.ID = "placeHolder";
this.UpdatePanel1.ContentTemplateContainer.Controls.Add(this.placeHolder);
this.OkButton.ID = "OkButton";
this.OkButton.Text = "确认";
this.OkButton.CausesValidation = false;
this.UpdatePanel1.ContentTemplateContainer.Controls.Add(this.OkButton);
this.cancelButton.ID = "cancelButton";
this.cancelButton.Text = "取消";
this.cancelButton.CausesValidation = false;
this.UpdatePanel1.ContentTemplateContainer.Controls.Add(this.cancelButton);
this.clearButton.ID = "clearButton";
this.clearButton.Text = "清除";
this.clearButton.CausesValidation = false;
this.clearButton.ToolTip = "清除";
this.UpdatePanel1.ContentTemplateContainer.Controls.Add(this.clearButton);
this.browseModalPopupExtender.ID = "browseModalPopupExtender";
this.browseModalPopupExtender.PopupControlID = "browsePanel";
this.browseModalPopupExtender.TargetControlID = "hiddenTargetControl";
this.browseModalPopupExtender.BackgroundCssClass = "prsModalBackground";
this.browseModalPopupExtender.RepositionMode = ModalPopupRepositionMode.None;
this.browseModalPopupExtender.DropShadow = true;
this.browseModalPopupExtender.Enabled = true;
this.Controls.Add(this.browseModalPopupExtender);
}
protected void dataSource_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
{
if (!this.allowBinding)
{
e.Cancel = true;
}
else
{
if (!e.ExecutingSelectCount && e.InputParameters.Contains("condition"))
{
//e.InputParameters["condition"] = this.gridViewFilterCtrl1.GetFilterCondition();
if (this.Condition != string.Empty)
{
IDictionary dictionary;
object obj2;
string str = string.Empty;
if (!string.IsNullOrEmpty(e.InputParameters["condition"] as string))
{
str = " AND ";
}
str = str + this.Condition;
(dictionary = e.InputParameters)[obj2 = "condition"] = dictionary[obj2] + str;
}
}
if (this.EnableSelectExXml)
{
e.InputParameters["xmlSchema"] = this.XmlSchema;
}
}
}
protected void GridView1_DataBound(object sender, EventArgs e)
{
if (this.GridView1.Rows.Count > 15)
{
this.browsePanel.Height = Unit.Pixel(500);
}
}
protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
this.allowBinding = true;
this.GridView1.SelectedIndex = -1;
this.OkButton.Enabled = false;
}
protected void GridView1_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
{
this.allowBinding = true;
this.OkButton.Enabled = true;
}
protected void GridView1_Sorted(object sender, EventArgs e)
{
this.GridView1.SelectedIndex = -1;
this.OkButton.Enabled = false;
}
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
this.allowBinding = true;
}
protected void GridViewFilter1_FilterButtonClick(object sender, CommandEventArgs e)
{
this.allowBinding = true;
this.GridView1.SelectedIndex = -1;
this.OkButton.Enabled = false;
this.GridView1.DataBind();
}
private void iBrowseButton_Click(object sender, EventArgs e)
{
this.EnsureChildControls();
this.OnBrowseButtonClick(sender, e);
}
private void Initialize()
{
this.GridView1.PageSize = this.PageSize;
this.ConfigureGridViewColumns(this.GridView1);
this.ConfigureDataSource(this.dataSource);
if (!this.showClearButton)
{
this.clearButton.Visible = false;
}
}
protected void OkButton_Click(object sender, EventArgs e)
{
this.browseModalPopupExtender.Hide();
BrowseValueSelectedArgs args = new BrowseValueSelectedArgs(this.GridView1.SelectedDataKey);
this.OnOkButtonClick(this, args);
}
protected virtual void OnBrowseButtonClick(object sender, EventArgs e)
{
this.allowBinding = true;
this.browseModalPopupExtender.Show();
this.GridView1.DataBind();
this.GridView1.SelectedIndex = -1;
this.OkButton.Enabled = false;
this.UpdatePanel1.Update();
}
protected override void OnInit(EventArgs e)
{
this.SetEventHandler();
this.SetExternalCtrlClickEventHandler();
base.OnInit(e);
}
protected virtual void OnOkButtonClick(object sender, BrowseValueSelectedArgs e)
{
if (this.BrowseValueSelected != null)
{
this.BrowseValueSelected(sender, e);
}
}
private void SetEventHandler()
{
this.dataSource.Selecting += new ObjectDataSourceSelectingEventHandler(this.dataSource_Selecting);
this.GridView1.PageIndexChanging += new GridViewPageEventHandler(this.GridView1_PageIndexChanging);
this.GridView1.SelectedIndexChanging += new GridViewSelectEventHandler(this.GridView1_SelectedIndexChanging);
this.GridView1.Sorting += new GridViewSortEventHandler(this.GridView1_Sorting);
this.GridView1.Sorted += new EventHandler(this.GridView1_Sorted);
this.GridView1.DataBound += new EventHandler(this.GridView1_DataBound);
this.OkButton.Click += new EventHandler(this.OkButton_Click);
this.cancelButton.Click += new EventHandler(this.cancelButton_Click);
this.clearButton.Click += new EventHandler(this.clearButton_Click);
//this.gridViewFilterCtrl1.FilterButtonClick += new CommandEventHandler(this.GridViewFilter1_FilterButtonClick);
}
private void SetExternalCtrlClickEventHandler()
{
if (!string.IsNullOrEmpty(this.controlToExtend))
{
IButtonControl control = FindControlUtility.RecursiveFindControl(this.Parent, this.controlToExtend) as IButtonControl;
if (control != null)
{
control.Click += new EventHandler(this.iBrowseButton_Click);
}
}
}
[Browsable(true)]
public bool AllowSelectParameters
{
get
{
return this.allowSelectParameters;
}
set
{
this.allowSelectParameters = value;
}
}
public string BreadTypeName
{
set
{
this.breadTypeName = value;
}
}
public string Condition
{
get
{
object obj2 = this.ViewState["BrowserCondition"];
if (obj2 != null)
{
return (string)obj2;
}
return string.Empty;
}
set
{
this.ViewState["BrowserCondition"] = value;
}
}
public string ControlToExtend
{
set
{
this.controlToExtend = value;
}
}
public string DataFieldItems
{
set
{
char[] separator = new char[] { ',', ' ' };
this.dataFieldItems = value.Split(separator, StringSplitOptions.RemoveEmptyEntries);
}
}
public string DataFormatStrings
{
set
{
char[] separator = new char[] { ',', ' ' };
this.dataFormatStrings = value.Split(separator, StringSplitOptions.RemoveEmptyEntries);
}
}
public string DataObjectTypeName
{
get
{
return this.dataObjectTypeName;
}
set
{
this.dataObjectTypeName = value;
}
}
public bool EnableSelectExXml
{
get
{
return this.enableSelectExXml;
}
set
{
this.enableSelectExXml = value;
}
}
public string GridViewDataKeyNames
{
set
{
char[] separator = new char[] { ',', ' ' };
this.gridViewDataKeyNames = value.Split(separator, StringSplitOptions.RemoveEmptyEntries);
}
}
[Localizable(true)]
public string HeaderTextItems
{
set
{
char[] separator = new char[] { ',' };
this.headerTextItems = value.Split(separator, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < this.headerTextItems.Length; i++)
{
this.headerTextItems[i] = this.headerTextItems[i].Trim();
}
}
}
protected int PageSize
{
get
{
object obj2 = this.ViewState["PageSize"];
if (obj2 == null)
{
object propertyValue = HttpContext.Current.Profile.GetPropertyValue("PagingSize");
obj2 = ((propertyValue == null) || (propertyValue.ToString() == string.Empty)) ? Globals.PagerSize : propertyValue.ToString();
this.ViewState["PageSize"] = obj2;
}
return int.Parse((string)obj2);
}
}
protected System.Web.UI.WebControls.PlaceHolder PlaceHolder
{
get
{
return this.placeHolder;
}
}
public string SelectCountMethod
{
get
{
return this.selectCountMethod;
}
set
{
this.selectCountMethod = value;
}
}
public string SelectMethod
{
get
{
return this.selectMethod;
}
set
{
this.selectMethod = value;
}
}
public bool ShowClearButton
{
set
{
this.showClearButton = value;
}
}
public string XmlSchema
{
get
{
return this.xmlSchema;
}
set
{
this.xmlSchema = value;
}
}
public delegate void BrowseValueSelectedEventHandler(object sender, BrowseValueSelectedArgs args);
}
}
namespace JamesTan
{
using System;
using System.Web.UI.WebControls;
public class BrowseValueSelectedArgs : EventArgs
{
private DataKey gridViewDataKey;
public BrowseValueSelectedArgs()
{
}
public BrowseValueSelectedArgs(DataKey dataKey)
{
this.gridViewDataKey = dataKey;
}
public DataKey GridViewDataKey
{
get
{
return this.gridViewDataKey;
}
set
{
this.gridViewDataKey = value;
}
}
}
}
namespace JamesTan.Util
{
using System;
using System.Web.UI;
public class FindControlUtility
{
public static Control RecursiveFindControl(Control namingContainer, string controlID)
{
Control control = null;
control = namingContainer.FindControl(controlID);
if ((control == null) && (namingContainer.NamingContainer != null))
{
control = RecursiveFindControl(namingContainer.NamingContainer, controlID);
}
return control;
}
public static Control RecursiveFindControl(Control namingContainer, Type t)
{
Control control = null;
if (namingContainer.GetType() == t)
{
return namingContainer;
}
if (namingContainer.Parent != null)
{
control = RecursiveFindControl(namingContainer.Parent, t);
}
return control;
}
}
}
引用该控件的方式如下:
<%@ Register Assembly="JamesTan.WebControls" Namespace="JamesTan.WebControls" TagPrefix="cc1" %>
<asp:TextBox ID="worktypeTextBox" runat="server" Text='' Enabled="False"></asp:TextBox>
<asp:Button ID="worktypeButton" runat="server" Text="..." Font-Bold="True" />
<cc1:JamesTanBrowserExtender ID="worktypeBrowser" runat="server" BreadTypeName="Siemens.SimaticIT.PRM.Breads.PersonPropertyType_BREAD"
DataFieldItems="ID,Label" DataObjectTypeName="Siemens.SimaticIT.PRM.Breads.Types.PersonPropertyType"
GridViewDataKeyNames="PK,ID,Label" HeaderTextItems="ID,名称" OnBrowseValueSelected="worktypeBrowser_BrowseValueSelected"
ControlToExtend="worktypeButton" Condition=" type=N'工种' " />
<asp:HiddenField ID="worktypeHiddenField" runat="server" Value="0" />
亲爱的各位老师,请帮我解决一下这个问题