1268 lines
61 KiB
VB.net
1268 lines
61 KiB
VB.net
Imports BaseClasses.Data
|
|
Imports BaseClasses.Utils.StringUtils
|
|
Imports BaseClasses.Utils
|
|
Imports BaseClasses.Resources
|
|
Imports Persons.Business
|
|
Imports Persons.Data
|
|
Imports BaseClasses.Web.UI
|
|
|
|
Imports System.Web.UI.DataVisualization.Charting
|
|
Namespace Persons.UI
|
|
' Typical customizations that may be done in this class include
|
|
' - adding custom event handlers
|
|
' - overriding base class methods
|
|
'
|
|
''' <summary>
|
|
''' The superclass (i.e. base class) for all Designer-generated pages in this application.
|
|
''' </summary>
|
|
''' <remarks>
|
|
''' <para>
|
|
''' </para>
|
|
''' </remarks>
|
|
|
|
|
|
Public Class BaseApplicationPage
|
|
Inherits BaseClasses.Web.UI.BasePage
|
|
|
|
Private _Enctype As String = ""
|
|
Public Property Enctype() As String
|
|
Get
|
|
Return Me._Enctype
|
|
End Get
|
|
Set(ByVal value As String)
|
|
Me._Enctype = value
|
|
End Set
|
|
End Property
|
|
|
|
Private Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreInit
|
|
Dim selectedTheme As String = Me.GetSelectedTheme()
|
|
If Not String.IsNullOrEmpty(selectedTheme) Then
|
|
Me.Page.Theme = selectedTheme
|
|
End If
|
|
End Sub
|
|
|
|
'Script to set focus to the last focused control
|
|
|
|
Private Const SCRIPT_DOFOCUS As String = "" & _
|
|
"<script language=""javascript"" type=""text/javascript"">" & _
|
|
"var ctrl = ""{ControlClientID}""; var ctrlPB = ""{CtrlIDToFocusOnPostBack}""; " & _
|
|
"function pageLoadedHandler1(sender, args) { " & _
|
|
"if(!isPostBack()) {setTimeout(""setTimeoutFocus()"", 1000);} " & _
|
|
"else {setTimeout(""setPostBackFocus()"", 100);}}" & _
|
|
"function setTimeoutFocus() { setFocus(ctrl); }" & _
|
|
"function setPostBackFocus() { doFocus(ctrlPB);}" & _
|
|
"function doFocus(ctrlID) { if((ctrlID == null) || (ctrlID == """")) return;" & _
|
|
"try { var objToFocus = null; try { objToFocus = document.getElementById(ctrlID); } catch(ex) {}" & _
|
|
"if(!(!objToFocus ||(objToFocus==null)||(objToFocus==""""))){objToFocus.focus();}} catch(ex){ }}" & _
|
|
"function isPostBack() {if (!document.getElementById(""{clientSideIsPostBack}"")) return false;" & _
|
|
"if (document.getElementById(""{clientSideIsPostBack}"").value == ""Y"") return true;" & _
|
|
"else return false;}" & _
|
|
"Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(pageLoadedHandler1);</script>"
|
|
|
|
|
|
'Add or remove controls if you do not want to retain focus on them
|
|
Public Sub LoadFocusScripts(ByVal CurrentControl As Control)
|
|
If TypeOf (CurrentControl) Is TextBox OrElse TypeOf (CurrentControl) Is DropDownList OrElse TypeOf (CurrentControl) Is ListBox OrElse _
|
|
TypeOf (CurrentControl) Is Button OrElse TypeOf (CurrentControl) Is ImageButton OrElse TypeOf (CurrentControl) Is RadioButtonList OrElse _
|
|
TypeOf (CurrentControl) Is RadioButton OrElse TypeOf (CurrentControl) Is LinkButton Then
|
|
DirectCast(CurrentControl, WebControl).Attributes.Add("onfocus", "try{document.getElementById(""__LASTFOCUS"").value=this.id;}catch(e){}")
|
|
End If
|
|
If CurrentControl.HasControls() Then
|
|
For Each CurrentChildControl As Control In CurrentControl.Controls
|
|
Me.LoadFocusScripts(CurrentChildControl)
|
|
Next
|
|
End If
|
|
End Sub
|
|
|
|
Public Overridable Sub SetFocusOnLoad()
|
|
Me.SetFocusOnLoad(Nothing)
|
|
End Sub
|
|
|
|
'''Sets focus to the control with ctrlClientID. If empty string is passed, sets focus to the first focusable control
|
|
Public Overridable Sub SetFocusOnLoad(ByVal currentControl As Control)
|
|
Dim ctrlClientID As String = ""
|
|
If currentControl IsNot Nothing Then
|
|
ctrlClientID = currentControl.ClientID
|
|
'currentControl.Focus()
|
|
End If
|
|
If Not ClientScript.IsStartupScriptRegistered(Page.GetType(), "SetFocusOnLoad") Then
|
|
Dim _clientSideIsPostBack As System.Web.UI.HtmlControls.HtmlInputHidden = DirectCast(Me.FindControlRecursively("_clientSideIsPostBack"), System.Web.UI.HtmlControls.HtmlInputHidden)
|
|
Dim _clientSideIsPostBackID As String = "_clientSideIsPostBack"
|
|
If Not _clientSideIsPostBack Is Nothing Then
|
|
_clientSideIsPostBackID = _clientSideIsPostBack.ClientID
|
|
End If
|
|
Dim script As String = SCRIPT_DOFOCUS
|
|
script = script.Replace("{ControlClientID}", ctrlClientID)
|
|
script = script.Replace("{clientSideIsPostBack}", _clientSideIsPostBackID)
|
|
Dim id As String = Request.Item("__LASTFOCUS")
|
|
If String.IsNullOrEmpty(id) Then
|
|
id = ""
|
|
End If
|
|
script = script.Replace("{CtrlIDToFocusOnPostBack}", id)
|
|
Dim sm As ScriptManager = ScriptManager.GetCurrent(Me.Page)
|
|
If sm.IsInAsyncPostBack Then
|
|
ScriptManager.RegisterClientScriptBlock(Me, Page.GetType(), "SetFocusOnPostback", script, False)
|
|
Else
|
|
ClientScript.RegisterStartupScript(Page.GetType(), "SetFocusOnLoad", script, False)
|
|
End If
|
|
|
|
End If
|
|
End Sub
|
|
'''Verifies that this is editable control
|
|
Public Overridable Function IsControlEditable(ByVal ctrl As Control, Optional ByVal includeCheckBox As Boolean = True) As Boolean
|
|
If TypeOf ctrl Is System.Web.UI.WebControls.TextBox OrElse _
|
|
TypeOf ctrl Is System.Web.UI.WebControls.DropDownList OrElse _
|
|
TypeOf ctrl Is System.Web.UI.WebControls.ListBox OrElse _
|
|
TypeOf ctrl Is System.Web.UI.WebControls.FileUpload Then
|
|
Return True
|
|
ElseIf includeCheckBox AndAlso TypeOf ctrl Is System.Web.UI.WebControls.CheckBox Then
|
|
Return True
|
|
End If
|
|
Return False
|
|
End Function
|
|
|
|
Public Overridable Function GetSelectedTheme() As String
|
|
'First try to get selected theme from Session
|
|
Dim Session As System.Web.SessionState.HttpSessionState = HttpContext.Current.Session
|
|
Dim selectedTheme As String = DirectCast(Session.Item(NetUtils.CookieSelectedTheme), String)
|
|
If Not String.IsNullOrEmpty(selectedTheme) Then
|
|
Return selectedTheme
|
|
End If
|
|
'There is no theme stored in session, possibly application is opened for the very first time.
|
|
'Try to get theme from the cookie
|
|
selectedTheme = BaseClasses.Utils.NetUtils.GetCookie(NetUtils.CookieSelectedTheme)
|
|
If Not String.IsNullOrEmpty(selectedTheme) Then
|
|
'make sure theme exists in application
|
|
Dim appDir As String = ""
|
|
Try
|
|
appDir = System.Web.HttpContext.Current.Server.MapPath("/")
|
|
If Not String.IsNullOrEmpty(appDir) Then appDir = appDir & "App_Themes"
|
|
Catch ex As Exception
|
|
|
|
End Try
|
|
If String.IsNullOrEmpty(appDir) Then
|
|
Try
|
|
appDir = System.Web.HttpContext.Current.Server.MapPath("")
|
|
If Not String.IsNullOrEmpty(appDir) Then
|
|
If Not System.IO.Directory.GetParent(appDir) Is Nothing Then
|
|
appDir = System.IO.Directory.GetParent(appDir).FullName & "\App_Themes"
|
|
ElseIf appDir.IndexOf("\") > 0 Then
|
|
appDir = appDir.Substring(0, appDir.LastIndexOf("\")) & "\App_Themes"
|
|
Else
|
|
appDir = ""
|
|
End If
|
|
End If
|
|
Catch ex As Exception
|
|
appDir = ""
|
|
End Try
|
|
End If
|
|
If Not String.IsNullOrEmpty(appDir) AndAlso System.IO.Directory.Exists(appDir) Then
|
|
If System.IO.Directory.Exists(System.IO.Path.Combine(appDir, selectedTheme)) Then
|
|
Session.Item(NetUtils.CookieSelectedTheme) = selectedTheme
|
|
Return selectedTheme
|
|
Else
|
|
BaseClasses.Utils.NetUtils.SetCookie(NetUtils.CookieSelectedTheme, "")
|
|
End If
|
|
End If
|
|
End If
|
|
Return ""
|
|
End Function
|
|
|
|
'Retrieve selected language from session or cookie
|
|
Public Overridable Function GetSelectedLanguage() As String
|
|
'First try to get selected language from Session
|
|
Dim Session As System.Web.SessionState.HttpSessionState = HttpContext.Current.Session
|
|
Dim selectedLanguage As String = DirectCast(Session("AppCultureUI"), String)
|
|
If Not String.IsNullOrEmpty(selectedLanguage) Then Return selectedLanguage
|
|
'There is no theme stored in session, possibly application is opened for the very first time.
|
|
'Try to get theme from the cookie
|
|
selectedLanguage = BaseClasses.Utils.NetUtils.GetCookie(NetUtils.CookieSelectedLanguage)
|
|
If Not String.IsNullOrEmpty(selectedLanguage) Then
|
|
Try
|
|
Dim culInfo As System.Globalization.CultureInfo = New System.Globalization.CultureInfo(selectedLanguage)
|
|
Session("AppCultureUI") = selectedLanguage
|
|
Return selectedLanguage
|
|
Catch
|
|
'if exception happened this language is not supported
|
|
BaseClasses.Utils.NetUtils.SetCookie(NetUtils.CookieSelectedLanguage, "")
|
|
selectedLanguage = System.Threading.Thread.CurrentThread.CurrentUICulture.Name
|
|
Session("AppCultureUI") = selectedLanguage
|
|
End Try
|
|
Else
|
|
selectedLanguage = System.Threading.Thread.CurrentThread.CurrentUICulture.Name
|
|
Session("AppCultureUI") = selectedLanguage
|
|
End If
|
|
|
|
Return selectedLanguage
|
|
|
|
End Function
|
|
|
|
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
|
|
'commented out because DataBind is being called multiple times.
|
|
' If (Not Me.IsPostBack) Then
|
|
' Me.DataBind()
|
|
' End If
|
|
End Sub
|
|
|
|
' Variable used to prevent infinite loop
|
|
Private _modifyRedirectUrlInProgress As Boolean = False
|
|
|
|
' Constant used for EvaluateExpressions
|
|
Const PREFIX_NO_ENCODE As String = "NoUrlEncode:"
|
|
|
|
''' Allow for migration from earlier versions which did not have url encryption.
|
|
Public Overridable Function ModifyRedirectUrl(ByVal redirectUrl As String, ByVal redirectArgument As String) As String
|
|
Return EvaluateExpressions(redirectUrl, redirectArgument, False)
|
|
End Function
|
|
|
|
Public Overridable Function ModifyRedirectUrl(ByVal redirectUrl As String, ByVal redirectArgument As String, ByVal bEncrypt As Boolean) As String
|
|
Return EvaluateExpressions(redirectUrl, redirectArgument, bEncrypt)
|
|
End Function
|
|
|
|
Public Overridable Function EvaluateExpressions( _
|
|
ByVal redirectUrl As String, _
|
|
ByVal redirectArgument As String, _
|
|
ByVal bEncrypt As Boolean) As String
|
|
Return EvaluateExpressions(redirectUrl, redirectArgument, bEncrypt, Me)
|
|
End Function
|
|
|
|
Public Overridable Function EvaluateExpressions( _
|
|
ByVal redirectUrl As String, _
|
|
ByVal redirectArgument As String, _
|
|
ByVal bEncrypt As Boolean, _
|
|
ByVal targetCtl As Control) As String
|
|
|
|
If (_modifyRedirectUrlInProgress) Then
|
|
Return Nothing
|
|
Else
|
|
_modifyRedirectUrlInProgress = True
|
|
End If
|
|
|
|
Dim finalRedirectUrl As String = redirectUrl
|
|
Dim finalRedirectArgument As String = redirectArgument
|
|
|
|
|
|
Dim remainingUrl As String = finalRedirectUrl
|
|
|
|
|
|
' encrypt constant value
|
|
If bEncrypt AndAlso targetCtl.GetType() Is Page.GetType() Then
|
|
remainingUrl &= "&"
|
|
finalRedirectUrl &= "&"
|
|
|
|
|
|
While (remainingUrl.IndexOf("="c) >= 0) And (remainingUrl.IndexOf("&"c) > 0) And _
|
|
(remainingUrl.IndexOf("="c) < remainingUrl.IndexOf("&"c))
|
|
|
|
Dim leftIndex As Integer = remainingUrl.IndexOf("="c)
|
|
Dim rightIndex As Integer = remainingUrl.IndexOf("&"c)
|
|
Dim encryptFrom As String = remainingUrl.Substring(leftIndex + 1, rightIndex - leftIndex - 1)
|
|
|
|
remainingUrl = remainingUrl.Substring(rightIndex + 1)
|
|
If Not encryptFrom.StartsWith("{") OrElse Not encryptFrom.EndsWith("}") Then
|
|
|
|
|
|
' check if it is already encrypted
|
|
Dim isEncrypted As Boolean = False
|
|
Try
|
|
If Decrypt(encryptFrom) <> "" Then
|
|
isEncrypted = True
|
|
End If
|
|
Catch
|
|
|
|
End Try
|
|
|
|
' if not, process encryption
|
|
If Not isEncrypted Then
|
|
Dim encryptTo As String = DirectCast(Me.Page, BaseApplicationPage).Encrypt(DirectCast(encryptFrom, String))
|
|
finalRedirectUrl = finalRedirectUrl.Replace("=" & encryptFrom & "&", "=" & encryptTo & "&")
|
|
End If
|
|
End If
|
|
End While
|
|
|
|
|
|
finalRedirectUrl = finalRedirectUrl.Trim("&"c)
|
|
End If
|
|
|
|
If (finalRedirectUrl Is Nothing OrElse finalRedirectUrl.Trim = "") Then
|
|
Return ""
|
|
ElseIf (finalRedirectUrl.IndexOf("{"c) < 0) Then
|
|
'RedirectUrl does not contain any format specifiers
|
|
_modifyRedirectUrlInProgress = False
|
|
Return finalRedirectUrl
|
|
Else
|
|
'The old way was to pass separate URL and arguments and use String.Format to
|
|
'do the replacement. Example:
|
|
' URL: EditProductsRecord?Products={0}
|
|
' Argument: PK
|
|
'The new way to is pass the arguments directly in the URL. Example:
|
|
' URL: EditProductsRecord?Products={PK}
|
|
'If the old way is passsed, convert it to the new way.
|
|
If (Len(redirectArgument) > 0) Then
|
|
Dim arguments() As String = Split(redirectArgument, ",")
|
|
Dim i As Integer
|
|
For i = 0 To (arguments.Length - 1)
|
|
finalRedirectUrl = finalRedirectUrl.Replace("{" & i.ToString & "}", "{" & arguments(i) & "}")
|
|
Next
|
|
|
|
finalRedirectArgument = ""
|
|
End If
|
|
|
|
'First find all the table and record controls in the page.
|
|
Dim controlList As New ArrayList()
|
|
GetAllRecordAndTableControls(targetCtl, controlList, True)
|
|
If controlList.Count = 0 Then
|
|
Return finalRedirectUrl
|
|
End If
|
|
|
|
' Store the controls in a hashtable using the control unique name
|
|
' as the key for easy refrence later in the function.
|
|
Dim controlIdList As New Hashtable
|
|
Dim control As System.Web.UI.Control
|
|
Dim found As Boolean = False
|
|
For Each control In controlList
|
|
Dim uID As String = control.UniqueID
|
|
Dim pageContentIndex As Integer = uID.IndexOf("$PageContent$")
|
|
If pageContentIndex > 0 Then
|
|
If found = False Then
|
|
'Remove all controls without $PageContent$ prefix, because this page is used with Master Page
|
|
'and these entries are irrelevant
|
|
controlIdList.Clear()
|
|
End If
|
|
found = True
|
|
End If
|
|
If found Then
|
|
'If we found that Master Page is used for this page construction than disregard all controls
|
|
'without $PageContent$ prefix
|
|
If pageContentIndex > 0 Then
|
|
uID = uID.Substring(pageContentIndex + "$PageContent$".Length)
|
|
controlIdList.Add(uID, control)
|
|
End If
|
|
Else
|
|
'No Master Page presense found so far
|
|
controlIdList.Add(uID, control)
|
|
End If
|
|
Next
|
|
|
|
'Look at all of the expressions in the URL and forward processing
|
|
'to the appropriate controls.
|
|
'Expressions can be of the form [ControlName:][NoUrlEncode:]Key[:Value]
|
|
Dim forwardTo As New ArrayList
|
|
|
|
remainingUrl = finalRedirectUrl
|
|
While (remainingUrl.IndexOf("{"c) >= 0) And (remainingUrl.IndexOf("}"c) > 0) And _
|
|
(remainingUrl.IndexOf("{"c) < remainingUrl.IndexOf("}"c))
|
|
|
|
Dim leftIndex As Integer = remainingUrl.IndexOf("{"c)
|
|
Dim rightIndex As Integer = remainingUrl.IndexOf("}"c)
|
|
Dim expression As String = remainingUrl.Substring(leftIndex + 1, rightIndex - leftIndex - 1)
|
|
remainingUrl = remainingUrl.Substring(rightIndex + 1)
|
|
|
|
Dim prefix As String = Nothing
|
|
If (expression.IndexOf(":") > 0) Then
|
|
prefix = expression.Substring(0, expression.IndexOf(":"))
|
|
End If
|
|
If (Not IsNothing(prefix)) AndAlso (prefix.Length > 0) AndAlso _
|
|
(Not (InvariantLCase(prefix) = InvariantLCase(PREFIX_NO_ENCODE))) AndAlso _
|
|
(Not BaseRecord.IsKnownExpressionPrefix(prefix)) Then
|
|
'The prefix is a control name. Add it to the list of controls that
|
|
'need to process the URL.
|
|
If (controlIdList.Contains(prefix)) And (Not forwardTo.Contains(prefix)) Then
|
|
forwardTo.Add(prefix)
|
|
End If
|
|
End If
|
|
End While
|
|
|
|
'Forward the request to each control in the forwardTo list
|
|
Dim containerId As String
|
|
For Each containerId In forwardTo
|
|
Dim ctl As Control = CType(controlIdList.Item(containerId), Control)
|
|
If (Not IsNothing(ctl)) Then
|
|
If TypeOf ctl Is BaseApplicationRecordControl Then
|
|
finalRedirectUrl = DirectCast(ctl, BaseApplicationRecordControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt)
|
|
ElseIf TypeOf ctl Is BaseApplicationTableControl Then
|
|
finalRedirectUrl = DirectCast(ctl, BaseApplicationTableControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt)
|
|
End If
|
|
End If
|
|
Next
|
|
|
|
'If there are any unresolved expressions, let the other naming containers
|
|
'have a crack at modifying the URL
|
|
For Each control In controlList
|
|
If (forwardTo.IndexOf(control.ID) < 0) Then
|
|
If TypeOf control Is BaseApplicationRecordControl Then
|
|
finalRedirectUrl = DirectCast(control, BaseApplicationRecordControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt)
|
|
ElseIf TypeOf control Is BaseApplicationTableControl Then
|
|
finalRedirectUrl = DirectCast(control, BaseApplicationTableControl).EvaluateExpressions(finalRedirectUrl, finalRedirectArgument, bEncrypt)
|
|
End If
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
_modifyRedirectUrlInProgress = False
|
|
|
|
Return finalRedirectUrl
|
|
End Function
|
|
|
|
Private Sub GetAllRecordAndTableControls(ByVal ctl As Control, ByVal controlList As ArrayList, ByVal withParents As Boolean)
|
|
If ctl Is Nothing Then
|
|
Return
|
|
End If
|
|
|
|
GetAllRecordAndTableControls(ctl, controlList)
|
|
|
|
If withParents Then
|
|
Dim parent As Control = ctl.Parent
|
|
While parent IsNot Nothing
|
|
If TypeOf (parent) Is BaseApplicationRecordControl OrElse TypeOf (parent) Is BaseApplicationTableControl Then
|
|
controlList.Add(parent)
|
|
End If
|
|
parent = parent.Parent
|
|
End While
|
|
End If
|
|
End Sub
|
|
|
|
Private Function GetAllRecordAndTableControls() As ArrayList
|
|
Dim controlList As ArrayList = New ArrayList()
|
|
GetAllRecordAndTableControls(Me, controlList)
|
|
Return controlList
|
|
End Function
|
|
|
|
Private Sub GetAllRecordAndTableControls(ByVal ctl As Control, ByVal controlList As ArrayList)
|
|
If ctl Is Nothing Then
|
|
Return
|
|
End If
|
|
|
|
If TypeOf ctl Is BaseApplicationRecordControl OrElse _
|
|
TypeOf ctl Is BaseApplicationTableControl Then
|
|
controlList.Add(ctl)
|
|
End If
|
|
|
|
Dim nextCtl As Control
|
|
For Each nextCtl In ctl.Controls()
|
|
GetAllRecordAndTableControls(nextCtl, controlList)
|
|
Next
|
|
End Sub
|
|
|
|
|
|
Public Function GetResourceValue(ByVal keyVal As String, ByVal appName As String) As String
|
|
Return AppResources.GetResourceValue(keyVal, appName)
|
|
End Function
|
|
|
|
Public Function GetResourceValue(ByVal keyVal As String) As String
|
|
Return AppResources.GetResourceValue(keyVal, Nothing)
|
|
End Function
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Public Function ExpandResourceValue(ByVal keyVal As String) As String
|
|
Return AppResources.ExpandResourceValue(keyVal)
|
|
End Function
|
|
|
|
''' -----------------------------------------------------------------------------
|
|
''' <summary>
|
|
''' Register Control buttonCtrl with ScriptManager to perform traditional postback instead of default async postback
|
|
''' </summary>
|
|
''' <remarks>
|
|
''' </remarks>
|
|
''' <history>
|
|
''' [sramarao] 3/2007 Created
|
|
''' </history>
|
|
''' -----------------------------------------------------------------------------
|
|
Public Sub RegisterPostBackTrigger(ByVal buttonCtrl As System.Web.UI.Control, ByVal updatePanelCtrl As System.Web.UI.Control)
|
|
Try
|
|
' Get current ScriptManager
|
|
Dim scriptMgr As ScriptManager = ScriptManager.GetCurrent(Me.Page)
|
|
' If Scriptmanager not preset return.
|
|
If scriptMgr Is Nothing Then
|
|
Return
|
|
End If
|
|
' If buttonCtrl is not surrounded by an UpdatePanel then return.
|
|
Dim CurrentUpdatePanel As System.Web.UI.UpdatePanel = CType(updatePanelCtrl, UpdatePanel)
|
|
If CurrentUpdatePanel Is Nothing Then
|
|
Return
|
|
End If
|
|
If buttonCtrl Is Nothing Then
|
|
Return
|
|
End If
|
|
scriptMgr.RegisterPostBackControl(buttonCtrl)
|
|
Catch ex As Exception
|
|
Throw ex
|
|
End Try
|
|
|
|
End Sub
|
|
|
|
Public Sub RegisterPostBackTrigger(ByVal buttonCtrl As System.Web.UI.Control)
|
|
Try
|
|
' Get current ScriptManager
|
|
Dim scriptMgr As ScriptManager = ScriptManager.GetCurrent(Me.Page)
|
|
' If Scriptmanager not preset return.
|
|
If scriptMgr Is Nothing Then
|
|
Return
|
|
End If
|
|
If buttonCtrl Is Nothing Then
|
|
Return
|
|
End If
|
|
scriptMgr.RegisterPostBackControl(buttonCtrl)
|
|
Catch ex As Exception
|
|
Throw ex
|
|
End Try
|
|
|
|
End Sub
|
|
|
|
Public Overridable Sub SaveData()
|
|
|
|
End Sub
|
|
|
|
Public Overridable Sub SetChartControl(ByVal chartCtrlName As String)
|
|
|
|
End Sub
|
|
|
|
#Region " Methods to manage saving and retrieving control values to session. "
|
|
Private _ShouldSaveControlsToSession As Boolean = False
|
|
Public Property ShouldSaveControlsToSession() As Boolean
|
|
Get
|
|
Return Me._ShouldSaveControlsToSession
|
|
End Get
|
|
Set(ByVal value As Boolean)
|
|
Me._ShouldSaveControlsToSession = value
|
|
End Set
|
|
End Property
|
|
|
|
Protected Sub Page_SaveControls_Unload(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Unload
|
|
If Me.ShouldSaveControlsToSession Then
|
|
Me.SaveControlsToSession()
|
|
End If
|
|
End Sub
|
|
|
|
Protected Overridable Sub SaveControlsToSession()
|
|
End Sub
|
|
|
|
Protected Sub Control_ClearControls_PreRender(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.PreRender
|
|
Me.ClearControlsFromSession()
|
|
End Sub
|
|
|
|
Protected Overridable Sub ClearControlsFromSession()
|
|
End Sub
|
|
|
|
Public Sub SaveToSession( _
|
|
ByVal control As Control, _
|
|
ByVal value As String)
|
|
|
|
SaveToSession(control.UniqueID, value)
|
|
End Sub
|
|
|
|
Public Function GetFromSession( _
|
|
ByVal control As Control, _
|
|
ByVal defaultValue As String) As String
|
|
|
|
Return GetFromSession(control.UniqueID, defaultValue)
|
|
End Function
|
|
|
|
Public Function GetFromSession(ByVal control As Control) As String
|
|
Return GetFromSession(control.UniqueID, Nothing)
|
|
End Function
|
|
|
|
Public Sub RemoveFromSession(ByVal control As Control)
|
|
RemoveFromSession(control.UniqueID)
|
|
End Sub
|
|
|
|
Public Function InSession(ByVal control As Control) As Boolean
|
|
Return InSession(control.UniqueID)
|
|
End Function
|
|
|
|
Public Sub SaveToSession( _
|
|
ByVal control As Control, _
|
|
ByVal variable As String, _
|
|
ByVal value As String)
|
|
|
|
SaveToSession(control.UniqueID & variable, value)
|
|
End Sub
|
|
|
|
Public Function GetFromSession( _
|
|
ByVal control As Control, _
|
|
ByVal variable As String, _
|
|
ByVal defaultValue As String) As String
|
|
|
|
Return GetFromSession(control.UniqueID & variable, defaultValue)
|
|
End Function
|
|
|
|
Public Sub RemoveFromSession( _
|
|
ByVal control As Control, _
|
|
ByVal variable As String)
|
|
|
|
RemoveFromSession(control.UniqueID & variable)
|
|
End Sub
|
|
|
|
Public Function InSession( _
|
|
ByVal control As Control, _
|
|
ByVal variable As String) As Boolean
|
|
|
|
Return InSession(control.UniqueID & variable)
|
|
End Function
|
|
|
|
Public Sub SaveToSession( _
|
|
ByVal name As String, _
|
|
ByVal value As String)
|
|
|
|
Me.Session()(GetValueKey(name)) = value
|
|
End Sub
|
|
|
|
Public Function GetFromSession( _
|
|
ByVal name As String, _
|
|
ByVal defaultValue As String) As String
|
|
|
|
Dim value As String = CType(Me.Session()(GetValueKey(name)), String)
|
|
If value Is Nothing OrElse value.Trim() = "" Then
|
|
value = defaultValue
|
|
End If
|
|
|
|
Return value
|
|
End Function
|
|
|
|
Public Function GetFromSession(ByVal name As String) As String
|
|
Return GetFromSession(name, Nothing)
|
|
End Function
|
|
|
|
Public Sub RemoveFromSession(ByVal name As String)
|
|
Me.Session.Remove(GetValueKey(name))
|
|
End Sub
|
|
|
|
Public Function InSession(ByVal name As String) As Boolean
|
|
Return (Not Me.Session(GetValueKey(name)) Is Nothing)
|
|
End Function
|
|
|
|
Public Function GetValueKey(ByVal name As String) As String
|
|
Return Me.Session.SessionID & Me.AppRelativeVirtualPath & name
|
|
End Function
|
|
#End Region
|
|
#Region " Methods to encrypt and decrypt URL parameters "
|
|
|
|
|
|
' The URLEncryptionKey is specified in the web.config. The rightmost three characters of the current
|
|
' Session Id are concatenated with the URLEncryptionKey to provide added protection. You can change
|
|
' this to anything you like by changing this function for the application.
|
|
' This function is private and not overridable because each page cannot have its own key - it must
|
|
' be common across the entire application.
|
|
Public Overridable Function Encrypt(ByVal Source As String, Optional ByVal includeSession As Boolean = True) As String
|
|
Dim CheckCrypto As Crypto = New Crypto(Crypto.Providers.DES)
|
|
Return CheckCrypto.Encrypt(Source, includeSession)
|
|
End Function
|
|
|
|
Public Overridable Function Decrypt(ByVal Source As String, Optional ByVal includeSession As Boolean = True) As String
|
|
Dim CheckCrypto As Crypto = New Crypto(Crypto.Providers.DES)
|
|
Return CheckCrypto.Decrypt(Source, includeSession)
|
|
End Function
|
|
|
|
' Encrypt url parameter which is enclosed in {}. For eg:..\Shared\SelectFileToImport?TableName=Employees
|
|
Public Function EncryptUrlParameter(ByVal url As String) As String
|
|
If (url Is Nothing) Then
|
|
Return ""
|
|
End If
|
|
|
|
If ((url.IndexOf(Microsoft.VisualBasic.ChrW(61)) > 0)) Then
|
|
Dim queryString() As String = url.Split(Microsoft.VisualBasic.ChrW(61))
|
|
Dim expression As String = queryString(1)
|
|
Dim encryptedValue As String = Encrypt(expression)
|
|
url = url.Replace(expression, encryptedValue)
|
|
|
|
End If
|
|
Return url
|
|
End Function
|
|
#End Region
|
|
|
|
#Region "Import Wizard methods"
|
|
Public Overridable Function GetPreviousURL() As String
|
|
Me.RemoveCurrentRequestFromSessionNavigationHistory()
|
|
|
|
Dim snh As BaseClasses.Web.SessionNavigationHistory = Me.GetSessionNavigationHistory()
|
|
Dim prevUrl As String = Nothing
|
|
Dim toRemoveRequest As Boolean = False
|
|
If Not snh Is Nothing Then
|
|
Dim prevRequest As BaseClasses.Web.SessionNavigationHistory.RequestInfo = snh.GetCurrentRequest()
|
|
If (Not IsNothing(prevRequest)) Then
|
|
If (InvariantUCase(Me.Request.Url.PathAndQuery) <> InvariantUCase(prevRequest._Url.PathAndQuery)) Then
|
|
'If it is different than the current URL, redirect to the previous request's URL
|
|
toRemoveRequest = True
|
|
prevUrl = prevRequest._Url.PathAndQuery
|
|
ElseIf ((Not IsNothing(prevRequest._UrlReferrer)) AndAlso _
|
|
(InvariantUCase(Me.Request.Url.PathAndQuery) <> InvariantUCase(prevRequest._UrlReferrer.PathAndQuery))) Then
|
|
'ElseIf it is different than the current URL, redirect to the previous request's URLReferrer
|
|
toRemoveRequest = True
|
|
prevUrl = prevRequest._UrlReferrer.PathAndQuery
|
|
End If
|
|
End If
|
|
End If
|
|
|
|
If String.IsNullOrEmpty(prevUrl) Then
|
|
prevUrl = BaseClasses.Configuration.ApplicationSettings.Current.DefaultPageUrl
|
|
End If
|
|
Return prevUrl
|
|
End Function
|
|
#End Region
|
|
|
|
#Region "Chart control initialization"
|
|
|
|
|
|
Public Const PIE As String = "Pie"
|
|
Public Const LINE As String = "Line"
|
|
Public Const BAR As String = "Bar"
|
|
Public Const COLUMN As String = "Column"
|
|
Public Const LabelInsideBar As String = "Label inside bar"
|
|
Public Const ValueAtBarEnd As String = "Value at bar end"
|
|
Public Const NothingInside As String = "Nothing"
|
|
|
|
|
|
''' <summary>
|
|
''' Creates chart control based on the passed parameters
|
|
''' </summary>
|
|
''' <param name="barThickness"> How thick the bar or column</param>
|
|
''' <param name="chartType">Bar, Column, Pie or Line</param>
|
|
''' <param name="usePalette">If true - uses Palette, otherwise - single color. For Pie chart palette is used regardless of this parameter</param>
|
|
''' <param name="palette">One of the palette in Windows.Forms.DataVisualization.ChartColorPalette </param>
|
|
''' <param name="color">One of the colors in Drawing.Color. Used for the bars, columns, or line</param>
|
|
''' <param name="fontFamily">One of the font familie as defined in Drawinf.FontFamily (string)</param>
|
|
''' <param name="fontColor">color of the font used for all texts - labels and values (from Drawing.color)</param>
|
|
''' <param name="backGroundColor">Background on the chart area. From Drawing.Color</param>
|
|
''' <param name="gridColor">The color used on all grid lines and markers. From Drawing.Color</param>
|
|
''' <param name="title">Title of the chart</param>
|
|
''' <param name="indexAxisTitle">Title on the Axis with labels</param>
|
|
''' <param name="valueAxisTitle">Title on the axis with values</param>
|
|
''' <param name="indexArray">Array of labels (String)</param>
|
|
''' <param name="valueArray">Array of values (Decimal)</param>
|
|
''' <param name="labelAngle">If 0, label on the X axis is shown horizontally, if negative, it is tilted counter clock wize, if positive,
|
|
''' tilted colck wise. Could be from -90 to 90. (degrees)</param>
|
|
''' <param name="customProperties">Added to custom properties to series. To the list of supported properties refer to
|
|
''' http://msdn.microsoft.com/en-us/library/dd456764.aspx</param>
|
|
''' <remarks></remarks>
|
|
Public Overridable Sub InitializeChartControl(ByVal chartControl As Chart, _
|
|
ByVal indexArray() As String, _
|
|
ByVal valueArray() As Decimal, _
|
|
ByVal barThickness As Integer, _
|
|
ByVal chartType As String, _
|
|
ByVal usePalette As Boolean, _
|
|
ByVal palette As ChartColorPalette, _
|
|
ByVal color As Drawing.Color, _
|
|
ByVal backGroundColor As System.Drawing.Color, _
|
|
ByVal gridColor As System.Drawing.Color, _
|
|
ByVal fontFamily As String, _
|
|
ByVal fontColor As System.Drawing.Color, _
|
|
ByVal internalLabelColor As System.Drawing.Color, _
|
|
ByVal showInsideBar As String, _
|
|
ByVal title As String, _
|
|
ByVal indexAxisTitle As String, _
|
|
ByVal valueAxisTitle As String, _
|
|
ByVal labelAngle As Integer, _
|
|
ByVal generatePercentage As Boolean, _
|
|
ByVal labelFormat As String, _
|
|
ByVal customProperties As String)
|
|
|
|
Dim args As New System.Collections.Generic.List(Of Object)
|
|
args.Add(chartControl)
|
|
args.Add(indexArray)
|
|
args.Add(valueArray)
|
|
args.Add(Nothing)
|
|
args.Add(Nothing)
|
|
args.Add(barThickness)
|
|
args.Add(chartType)
|
|
args.Add(usePalette)
|
|
args.Add(palette)
|
|
args.Add(color)
|
|
args.Add(backGroundColor)
|
|
args.Add(gridColor)
|
|
args.Add(fontFamily)
|
|
args.Add(fontColor)
|
|
args.Add(internalLabelColor)
|
|
args.Add(showInsideBar)
|
|
args.Add(title)
|
|
args.Add(indexAxisTitle)
|
|
args.Add(valueAxisTitle)
|
|
args.Add(labelAngle)
|
|
args.Add(generatePercentage)
|
|
args.Add(labelFormat)
|
|
args.Add("")
|
|
args.Add("")
|
|
args.Add("")
|
|
args.Add("")
|
|
args.Add("")
|
|
args.Add(customProperties)
|
|
InitializeChartControl(args.ToArray())
|
|
End Sub
|
|
|
|
|
|
''' <summary>
|
|
''' Creates chart control based on the passed parameters
|
|
''' </summary>
|
|
''' <param name="args"> parameters to initialize the chart
|
|
''' http://msdn.microsoft.com/en-us/library/dd456764.aspx</param>
|
|
''' <remarks>chart control or Nothing</remarks>
|
|
Public Overridable Sub InitializeChartControl(ByVal args() As Object)
|
|
|
|
Dim chartControl As Chart = Nothing
|
|
Dim indexArray() As String = Nothing
|
|
Dim valueArray() As Decimal = Nothing
|
|
Dim legendURLArray() As String = Nothing
|
|
Dim dataPointURLArray() As String = Nothing
|
|
Dim barThickness As Integer = 3
|
|
Dim chartType As String = Nothing
|
|
Dim usePalette As Boolean = False
|
|
Dim palette As ChartColorPalette = ChartColorPalette.None
|
|
Dim color As Drawing.Color = Drawing.Color.White
|
|
Dim backGroundColor As System.Drawing.Color = Drawing.Color.White
|
|
Dim gridColor As System.Drawing.Color = Drawing.Color.Black
|
|
Dim fontFamily As String = Nothing
|
|
Dim fontColor As System.Drawing.Color = Drawing.Color.Black
|
|
Dim internalLabelColor As System.Drawing.Color = Drawing.Color.Black
|
|
Dim showInsideBar As String = ""
|
|
Dim title As String = ""
|
|
Dim indexAxisTitle As String = ""
|
|
Dim valueAxisTitle As String = ""
|
|
Dim labelAngle As Integer = 0
|
|
Dim generatePercentage As Boolean = False
|
|
Dim labelFormat As String = Nothing
|
|
Dim chartTitleFontSize As String = ""
|
|
Dim axisTitleFontSize As String = ""
|
|
Dim scaleFontSize As String = ""
|
|
Dim labelInsideFontSize As String = ""
|
|
Dim customProperties As String = ""
|
|
|
|
|
|
If args.Length > 0 AndAlso args(0) IsNot Nothing Then
|
|
chartControl = DirectCast(args(0), Chart)
|
|
End If
|
|
If args.Length > 1 AndAlso args(1) IsNot Nothing Then
|
|
indexArray = DirectCast(args(1), String())
|
|
End If
|
|
If args.Length > 2 AndAlso args(2) IsNot Nothing Then
|
|
valueArray = DirectCast(args(2), Decimal())
|
|
End If
|
|
If args.Length > 3 AndAlso args(3) IsNot Nothing Then
|
|
legendURLArray = DirectCast(args(3), String())
|
|
End If
|
|
If args.Length > 4 AndAlso args(4) IsNot Nothing Then
|
|
dataPointURLArray = DirectCast(args(4), String())
|
|
End If
|
|
If args.Length > 5 AndAlso args(5) IsNot Nothing Then
|
|
barThickness = DirectCast(args(5), Integer)
|
|
End If
|
|
If args.Length > 6 AndAlso args(6) IsNot Nothing Then
|
|
chartType = DirectCast(args(6), String)
|
|
End If
|
|
If args.Length > 7 AndAlso args(7) IsNot Nothing Then
|
|
usePalette = DirectCast(args(7), Boolean)
|
|
End If
|
|
If args.Length > 8 AndAlso args(8) IsNot Nothing Then
|
|
palette = DirectCast(args(8), ChartColorPalette)
|
|
End If
|
|
If args.Length > 9 AndAlso args(9) IsNot Nothing Then
|
|
color = DirectCast(args(9), Drawing.Color)
|
|
End If
|
|
If args.Length > 10 AndAlso args(10) IsNot Nothing Then
|
|
backGroundColor = DirectCast(args(10), Drawing.Color)
|
|
End If
|
|
If args.Length > 11 AndAlso args(11) IsNot Nothing Then
|
|
gridColor = DirectCast(args(11), Drawing.Color)
|
|
End If
|
|
If args.Length > 12 AndAlso args(12) IsNot Nothing Then
|
|
fontFamily = DirectCast(args(12), String)
|
|
End If
|
|
If args.Length > 13 AndAlso args(13) IsNot Nothing Then
|
|
fontColor = DirectCast(args(13), Drawing.Color)
|
|
End If
|
|
If args.Length > 14 AndAlso args(14) IsNot Nothing Then
|
|
internalLabelColor = DirectCast(args(14), Drawing.Color)
|
|
End If
|
|
If args.Length > 15 AndAlso args(15) IsNot Nothing Then
|
|
showInsideBar = DirectCast(args(15), String)
|
|
End If
|
|
If args.Length > 16 AndAlso args(16) IsNot Nothing Then
|
|
title = DirectCast(args(16), String)
|
|
End If
|
|
If args.Length > 17 AndAlso args(17) IsNot Nothing Then
|
|
indexAxisTitle = DirectCast(args(17), String)
|
|
End If
|
|
If args.Length > 18 AndAlso args(18) IsNot Nothing Then
|
|
valueAxisTitle = DirectCast(args(18), String)
|
|
End If
|
|
If args.Length > 19 AndAlso args(19) IsNot Nothing Then
|
|
labelAngle = DirectCast(args(19), Integer)
|
|
End If
|
|
If args.Length > 20 AndAlso args(20) IsNot Nothing Then
|
|
generatePercentage = DirectCast(args(20), Boolean)
|
|
End If
|
|
If args.Length > 21 AndAlso args(21) IsNot Nothing Then
|
|
labelFormat = DirectCast(args(21), String)
|
|
End If
|
|
If args.Length > 22 AndAlso args(22) IsNot Nothing Then
|
|
chartTitleFontSize = DirectCast(args(22), String)
|
|
End If
|
|
If args.Length > 23 AndAlso args(23) IsNot Nothing Then
|
|
axisTitleFontSize = DirectCast(args(23), String)
|
|
End If
|
|
If args.Length > 24 AndAlso args(24) IsNot Nothing Then
|
|
scaleFontSize = DirectCast(args(24), String)
|
|
End If
|
|
If args.Length > 25 AndAlso args(25) IsNot Nothing Then
|
|
labelInsideFontSize = DirectCast(args(25), String)
|
|
End If
|
|
If args.Length > 26 AndAlso args(26) IsNot Nothing Then
|
|
customProperties = DirectCast(args(26), String)
|
|
End If
|
|
|
|
|
|
|
|
'Add chart area to the control
|
|
Dim baseChartAreaName As String = "ChartArea"
|
|
Dim chartAreaName As String = "ChartArea1"
|
|
If Not chartControl.ChartAreas Is Nothing AndAlso chartControl.ChartAreas.Count > 0 Then
|
|
Dim suffix As Integer = 1
|
|
Dim found As Boolean = True
|
|
|
|
While found AndAlso suffix < 100
|
|
chartAreaName = baseChartAreaName & suffix.ToString()
|
|
found = False
|
|
For Each ca As ChartArea In chartControl.ChartAreas
|
|
If ca.Name = chartAreaName Then
|
|
found = True
|
|
suffix += 1
|
|
Exit For
|
|
End If
|
|
Next
|
|
End While
|
|
If found Then Return
|
|
End If
|
|
Dim chartArea As ChartArea = chartControl.ChartAreas.Add(chartAreaName)
|
|
|
|
chartArea.AxisX.TitleForeColor = fontColor
|
|
chartArea.AxisY.TitleForeColor = fontColor
|
|
|
|
chartArea.AxisX.TitleFont = New System.Drawing.Font(fontFamily, If(Integer.TryParse(chartTitleFontSize, 0), Integer.Parse(axisTitleFontSize), chartArea.AxisX.TitleFont.Size))
|
|
chartArea.AxisY.TitleFont = New System.Drawing.Font(fontFamily, If(Integer.TryParse(chartTitleFontSize, 0), Integer.Parse(axisTitleFontSize), chartArea.AxisY.TitleFont.Size))
|
|
chartArea.AxisY.IsLabelAutoFit = True
|
|
chartArea.AxisX.IsLabelAutoFit = False
|
|
chartArea.AxisX.Interval = 1
|
|
chartArea.AxisX.MajorGrid.LineColor = System.Drawing.Color.LightGray
|
|
chartArea.AxisY.MajorGrid.LineColor = System.Drawing.Color.LightGray
|
|
chartArea.AxisX.LabelStyle.ForeColor = fontColor
|
|
chartArea.AxisY.LabelStyle.ForeColor = fontColor
|
|
chartArea.AxisX.LabelStyle.Font = New System.Drawing.Font(fontFamily, If(Integer.TryParse(scaleFontSize, 0), Integer.Parse(scaleFontSize), chartArea.AxisX.LabelStyle.Font.Size))
|
|
chartArea.AxisX.LineColor = gridColor
|
|
chartArea.AxisY.LineColor = gridColor
|
|
chartArea.AxisX.MajorTickMark.LineColor = gridColor
|
|
chartArea.AxisY.MajorTickMark.LineColor = gridColor
|
|
chartArea.AxisX.LabelStyle.Enabled = True
|
|
chartArea.AxisY.LabelStyle.Enabled = True
|
|
chartArea.AxisX.Title = indexAxisTitle
|
|
chartArea.AxisY.Title = valueAxisTitle
|
|
chartArea.AxisY.LabelStyle.Format = labelFormat
|
|
If generatePercentage Then
|
|
chartArea.AxisY.LabelStyle.Format = "0%"
|
|
End If
|
|
chartArea.AxisY.LabelStyle.Font = New System.Drawing.Font(fontFamily, If(Integer.TryParse(scaleFontSize, 0), Integer.Parse(scaleFontSize), chartArea.AxisY.LabelStyle.Font.Size))
|
|
chartArea.BackColor = backGroundColor
|
|
'Now add Series
|
|
Dim baseSeriesName As String = "Series"
|
|
Dim seriesName As String = "Series1"
|
|
If Not chartControl.Series Is Nothing AndAlso chartControl.Series.Count > 0 Then
|
|
Dim suffix As Integer = 1
|
|
Dim found As Boolean = True
|
|
|
|
While found AndAlso suffix < 100
|
|
seriesName = baseSeriesName & suffix.ToString()
|
|
found = False
|
|
For Each s As Series In chartControl.Series
|
|
If s.Name = seriesName Then
|
|
found = True
|
|
suffix += 1
|
|
Exit For
|
|
End If
|
|
Next
|
|
End While
|
|
If found Then Return
|
|
End If
|
|
Dim series As Series = chartControl.Series.Add(seriesName)
|
|
|
|
series.ChartArea = chartAreaName
|
|
chartControl.Series(seriesName).Points.Clear()
|
|
chartControl.Series(seriesName).BackGradientStyle = GradientStyle.None
|
|
chartControl.Series(seriesName).BackHatchStyle = ChartHatchStyle.None
|
|
chartControl.Series(seriesName).Font = New System.Drawing.Font(fontFamily, 6)
|
|
chartControl.Series(seriesName).LabelForeColor = fontColor
|
|
chartControl.Series(seriesName).SmartLabelStyle.AllowOutsidePlotArea = LabelOutsidePlotAreaStyle.Yes
|
|
chartControl.AntiAliasing = AntiAliasingStyles.All
|
|
|
|
If usePalette OrElse chartType = PIE Then
|
|
chartControl.Series(seriesName).Palette = palette
|
|
Else
|
|
chartControl.Series(seriesName).Color = color
|
|
End If
|
|
|
|
Dim baseTitleName As String = "Title"
|
|
Dim TitleName As String = "Title1"
|
|
If Not chartControl.Titles Is Nothing AndAlso chartControl.Titles.Count > 0 Then
|
|
Dim suffix As Integer = 1
|
|
Dim found As Boolean = True
|
|
|
|
While found AndAlso suffix < 100
|
|
TitleName = baseTitleName & suffix.ToString()
|
|
found = False
|
|
For Each t As Title In chartControl.Titles
|
|
If t.Name = TitleName Then
|
|
found = True
|
|
suffix += 1
|
|
Exit For
|
|
End If
|
|
Next
|
|
End While
|
|
If found Then Return
|
|
End If
|
|
Dim titleIndex As Integer = chartControl.Titles.Count - 1
|
|
chartControl.Titles.Add(TitleName).Text = title
|
|
titleIndex += 1
|
|
chartControl.Titles(titleIndex).ForeColor = fontColor
|
|
chartControl.Titles(titleIndex).Font = New System.Drawing.Font(fontFamily, If(Integer.TryParse(chartTitleFontSize, 0), Integer.Parse(chartTitleFontSize), chartArea.AxisY.TitleFont.Size))
|
|
|
|
Dim dataSet As New System.Data.DataSet()
|
|
Dim seriesTable As New System.Data.DataTable()
|
|
Dim cProperties As String = customProperties
|
|
seriesTable.Columns.Add(New System.Data.DataColumn("X", GetType(String)))
|
|
If (labelFormat = "0") Then
|
|
seriesTable.Columns.Add(New System.Data.DataColumn("Y", GetType(Integer)))
|
|
Else
|
|
seriesTable.Columns.Add(New System.Data.DataColumn("Y", GetType(Double)))
|
|
End If
|
|
|
|
'Append cProperties with some style qualifiers
|
|
|
|
If Not cProperties.ToLower.Contains("DrawingStyle".ToLower) Then
|
|
If Not String.IsNullOrEmpty(cProperties) AndAlso Not cProperties.EndsWith(",") Then cProperties &= ","
|
|
cProperties &= "DrawingStyle = Emboss"
|
|
End If
|
|
|
|
If String.Equals(showInsideBar, LabelInsideBar, StringComparison.InvariantCultureIgnoreCase) AndAlso _
|
|
chartType <> PIE Then
|
|
|
|
If Not cProperties.ToLower.Contains("BarLabelStyle".ToLower) Then
|
|
If Not String.IsNullOrEmpty(cProperties) AndAlso Not cProperties.EndsWith(",") Then cProperties &= ","
|
|
cProperties &= "BarLabelStyle = Center"
|
|
End If
|
|
|
|
End If
|
|
If chartType = PIE Then
|
|
If showInsideBar = ValueAtBarEnd Then
|
|
If Not cProperties.ToLower.Contains("PieLabelStyle".ToLower) Then
|
|
If Not String.IsNullOrEmpty(cProperties) AndAlso Not cProperties.EndsWith(",") Then cProperties &= ","
|
|
cProperties &= "PieLabelStyle = Outside"
|
|
End If
|
|
|
|
Else
|
|
If Not cProperties.ToLower.Contains("PieLabelStyle".ToLower) Then
|
|
If Not String.IsNullOrEmpty(cProperties) AndAlso Not cProperties.EndsWith(",") Then cProperties &= ","
|
|
cProperties &= "PieLabelStyle = Inside"
|
|
End If
|
|
|
|
End If
|
|
If Not cProperties.ToLower.Contains("PieDrawingStyle".ToLower) Then
|
|
If Not String.IsNullOrEmpty(cProperties) AndAlso Not cProperties.EndsWith(",") Then cProperties &= ","
|
|
cProperties &= "PieDrawingStyle = Concave"
|
|
End If
|
|
|
|
End If
|
|
|
|
Select Case chartType
|
|
Case BAR
|
|
chartArea.AxisY.LabelStyle.Angle = labelAngle
|
|
series.ChartType = SeriesChartType.Bar
|
|
If Not cProperties.ToLower.Contains("PixelPointWidth".ToLower) Then
|
|
Dim barWidth As String = "PixelPointWidth = " & barThickness
|
|
If Not String.IsNullOrEmpty(cProperties) AndAlso Not cProperties.EndsWith(",") Then cProperties &= ","
|
|
cProperties &= barWidth
|
|
End If
|
|
Case COLUMN
|
|
chartArea.AxisX.LabelStyle.Angle = labelAngle
|
|
series.ChartType = SeriesChartType.Column
|
|
If Not cProperties.ToLower.Contains("PixelPointWidth".ToLower) Then
|
|
Dim barWidth As String = "PixelPointWidth = " & barThickness
|
|
If Not String.IsNullOrEmpty(cProperties) AndAlso Not cProperties.EndsWith(",") Then cProperties &= ","
|
|
cProperties &= barWidth
|
|
End If
|
|
Case LINE
|
|
chartArea.AxisX.LabelStyle.Angle = labelAngle
|
|
series.ChartType = SeriesChartType.Line
|
|
Case PIE
|
|
chartControl.Series(seriesName).BorderColor = System.Drawing.Color.LightGray
|
|
chartControl.Series(seriesName).BorderWidth = 1
|
|
series.ChartType = SeriesChartType.Pie
|
|
'Construct Legend
|
|
Dim baseLegendName As String = "Legend"
|
|
Dim legendName As String = "Legend1"
|
|
If Not chartControl.Legends Is Nothing AndAlso chartControl.Legends.Count > 0 Then
|
|
Dim suffix As Integer = 1
|
|
Dim found As Boolean = True
|
|
While found AndAlso suffix < 100
|
|
legendName = baseLegendName & suffix.ToString()
|
|
found = False
|
|
For Each l As Legend In chartControl.Legends
|
|
If l.Name = legendName Then
|
|
found = True
|
|
suffix += 1
|
|
Exit For
|
|
End If
|
|
Next
|
|
End While
|
|
If found Then Return
|
|
End If
|
|
Dim legend As System.Web.UI.DataVisualization.Charting.Legend = chartControl.Legends.Add(legendName)
|
|
legend.Title = indexAxisTitle
|
|
legend.ForeColor = fontColor
|
|
legend.TitleFont = New System.Drawing.Font(fontFamily, If(Integer.TryParse(axisTitleFontSize, 0), Integer.Parse(axisTitleFontSize), legend.TitleFont.Size))
|
|
legend.Font = New System.Drawing.Font(fontFamily, If(Integer.TryParse(scaleFontSize, 0), Integer.Parse(scaleFontSize), legend.Font.Size))
|
|
legend.TitleForeColor = chartArea.AxisX.TitleForeColor
|
|
End Select
|
|
chartControl.Series(seriesName).CustomProperties = cProperties
|
|
|
|
'Sanity check for label and value arrays. They should not be empty
|
|
If indexArray Is Nothing OrElse valueArray Is Nothing Then
|
|
Return
|
|
End If
|
|
|
|
'Add data to data table. For Bar chart add them in the reversed order
|
|
Dim dimention As Integer = indexArray.Length - 1
|
|
If dimention > valueArray.Length - 1 Then dimention = valueArray.Length - 1
|
|
If chartType = BAR Then
|
|
For i As Integer = dimention To 0 Step -1
|
|
seriesTable.Rows.Add(New Object() {indexArray(i), Convert.ToDouble(valueArray(i))})
|
|
Next
|
|
If legendURLArray IsNot Nothing AndAlso legendURLArray.Length > 0 Then
|
|
Array.Reverse(legendURLArray)
|
|
End If
|
|
If dataPointURLArray IsNot Nothing AndAlso dataPointURLArray.Length > 0 Then
|
|
Array.Reverse(dataPointURLArray)
|
|
End If
|
|
Else
|
|
For i As Integer = 0 To dimention
|
|
seriesTable.Rows.Add(New Object() {indexArray(i), Convert.ToDouble(valueArray(i))})
|
|
Next
|
|
End If
|
|
|
|
|
|
dataSet.Tables.Add(seriesTable)
|
|
|
|
series.BorderWidth = 2
|
|
chartControl.Series(seriesName).XValueMember = "X"
|
|
chartControl.Series(seriesName).YValueMembers = "Y"
|
|
|
|
chartControl.DataSource = dataSet
|
|
If chartControl.DataSource Is Nothing Then
|
|
Return
|
|
Else
|
|
chartControl.DataBind()
|
|
End If
|
|
|
|
|
|
|
|
'now when data bound to the chart, change some properties on particular elements (data points) of series
|
|
If chartType = PIE Then
|
|
For Each dp As DataPoint In chartControl.Series(seriesName).Points
|
|
If showInsideBar = ValueAtBarEnd Then
|
|
dp.LabelForeColor = fontColor
|
|
Else
|
|
dp.LabelForeColor = internalLabelColor
|
|
End If
|
|
|
|
Dim value As Double = dp.YValues(0)
|
|
dp.Label = value.ToString(labelFormat)
|
|
If Not String.IsNullOrEmpty(dp.AxisLabel) Then
|
|
dp.LegendText = "#AXISLABEL"
|
|
Else
|
|
dp.LegendText = " "
|
|
End If
|
|
|
|
Next
|
|
|
|
For i As Integer = 0 To chartControl.Series(seriesName).Points.Count - 1
|
|
Dim dp As DataPoint = chartControl.Series(seriesName).Points(i)
|
|
If legendURLArray IsNot Nothing AndAlso i < legendURLArray.Length Then
|
|
dp.LegendUrl = legendURLArray(i)
|
|
dp.LegendMapAreaAttributes = "target=""_blank"""
|
|
End If
|
|
If dataPointURLArray IsNot Nothing AndAlso i < dataPointURLArray.Length Then
|
|
dp.Url = dataPointURLArray(i)
|
|
dp.MapAreaAttributes = "target=""_blank"""
|
|
End If
|
|
dp.Font = New System.Drawing.Font(fontFamily, If(Integer.TryParse(scaleFontSize, 0), Integer.Parse(scaleFontSize), dp.Font.Size))
|
|
|
|
Next
|
|
|
|
Else
|
|
If showInsideBar = ValueAtBarEnd Then
|
|
|
|
' find out the largest value to be shown
|
|
Dim largestValInChart As Decimal = Decimal.MinValue
|
|
For Each v As Decimal In valueArray
|
|
If largestValInChart < v Then
|
|
largestValInChart = v
|
|
End If
|
|
Next
|
|
|
|
|
|
For Each dp As DataPoint In chartControl.Series(seriesName).Points
|
|
dp.MarkerStyle = MarkerStyle.None
|
|
Dim value As Double = dp.YValues(0)
|
|
dp.Label = value.ToString(labelFormat)
|
|
dp.LabelForeColor = fontColor
|
|
dp.CustomProperties = "BarLabelStyle = Outside"
|
|
|
|
' for small value, show the label outside
|
|
' for large value, show the label inside
|
|
If chartType = BAR AndAlso (largestValInChart / 2) < value Then
|
|
dp.LabelForeColor = internalLabelColor
|
|
dp.CustomProperties = "BarLabelStyle = Right"
|
|
End If
|
|
Next
|
|
ElseIf showInsideBar = LabelInsideBar Then
|
|
If chartControl.Series(seriesName).Points.Count = indexArray.Length Then
|
|
Dim index As Integer = 0
|
|
Dim increment As Integer = 1
|
|
Dim lColor As Drawing.Color = fontColor
|
|
chartArea.AxisX.LabelStyle.Enabled = False
|
|
If chartType = BAR Then
|
|
lColor = internalLabelColor
|
|
index = indexArray.Length - 1
|
|
increment = -1
|
|
End If
|
|
For Each dp As DataPoint In chartControl.Series(seriesName).Points
|
|
dp.MarkerStyle = MarkerStyle.None
|
|
dp.CustomProperties = "BarLabelStyle = Center"
|
|
dp.LabelForeColor = lColor
|
|
dp.Label = indexArray(index)
|
|
index += increment
|
|
Next
|
|
End If
|
|
End If
|
|
For i As Integer = 0 To chartControl.Series(seriesName).Points.Count - 1
|
|
Dim dp As DataPoint = chartControl.Series(seriesName).Points(i)
|
|
If String.IsNullOrEmpty(dp.AxisLabel) Then
|
|
dp.AxisLabel = " "
|
|
End If
|
|
If legendURLArray IsNot Nothing AndAlso i < legendURLArray.Length Then
|
|
dp.LegendUrl = legendURLArray(i)
|
|
dp.LegendMapAreaAttributes = "target=""_blank"""
|
|
End If
|
|
If dataPointURLArray IsNot Nothing AndAlso i < dataPointURLArray.Length Then
|
|
dp.Url = dataPointURLArray(i)
|
|
dp.MapAreaAttributes = "target=""_blank"""
|
|
End If
|
|
dp.Font = New System.Drawing.Font(fontFamily, If(Integer.TryParse(labelInsideFontSize, 0), Integer.Parse(labelInsideFontSize), dp.Font.Size))
|
|
|
|
Next
|
|
End If
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
End Class
|
|
|
|
End Namespace
|