I have found a 90% solution for how to get a modal dialog to maintain
its position after postback. (More later on the remaining 10%.)
In a nutshell, when the user clicks a button or other control that
causes a postback/submit, I retain the window.screenLeft and .screenTop
in hidden text inputs, and include script to set the window.dialogLeft
and .dialogTop in the response.
This is not a 100% solution. The dialog maintains its postion, but if
you move the dialog and then do a submit/postback, it will jump back to
its original (prior to moving the dialog) position for a brief moment
until the positioning script is run to place it to where you moved it.
I haven't figured out how to overcome that, so I appreciate any
suggestions or ideas.
Now for more details. First of all, this is an ASP.Net appliction with
VB.Net as the server-side codebehind langauge. In the dialog, I have
two hidden <aspnet:textbox runat="server"> controls whose IDs are
hidXPos and hidYPos, respectively.
I have a javascript function whose purpose is to retain the current
window position. It is placed in the onclick event handler for any
control that does a submit/postback -- prior, of course, to doing the
submit.
function RecordPosition() {
var ohidXPos = document.getElementById('hidXPos');
var ohidYPos = document.getElementById('hidYPos');
ohidXPos.value = window.screenLeft;
ohidYPos.value = window.screenTop;
}
In the server-side code-behind, the Page_Load sub, which handles the
Page Load event, contains the following code snippit. Notice that I
subtract 3 pixels from dialogLeft and 22px from dialogTop to compensate
for thw window border and caption bar.
If hidXPos.Text <> "" And hidYPos.Text <> "" Then
Dim strScr As New System.Text.StringBuilder
strScr.Append("<script language='javascript'>" & vbNewLine)
strScr.Append("window.dialogLeft = '")
strScr.Append(hidXPos.Text - 3)
strScr.Append("';" & vbNewLine)
strScr.Append("window.dialogTop = '")
strScr.Append(hidYPos.Text - 22)
strScr.Append("';" & vbNewLine)
strScr.Append("</script>" & vbNewLine)
RegisterStartupScript("position", strScr.ToString)
End If
This produces script that looks like the following, for example:
<script language='javascript'>
window.dialogLeft = '259';
window.dialogTop = '117';
</script>
Another idea I tried unsuccessfully was to set window.dialogLeft and
Top in the above RecordPosition function. That seemed to have no
effect.
Thanks,
Rod