GridView顯示的內(nèi)容行數(shù)比較多需要垂直方向滾動條,但是遇到這樣一個問題,如果我們把滾動條拖到最下面,此時點擊GridView行按鈕事件,不論是刷新頁面其它控件還是彈出一個alert,都會導致GridView的滾動條自動回到第一行狀態(tài),用戶之前滑動到的位置丟失了,用戶需要再次將滾動條拖到上次的位置,操作麻煩,影響用戶體驗.解決方案:用js記錄滾動條坐標,實現(xiàn)錨定效果
- <script type="text/javascript" language="javascript">
- function RecordPostion(obj) {
- var diva = obj;
- var sx = document.getElementById('<%=dvscrollX.ClientID %>');
- var sy = document.getElementById('<%=dvscrollY.ClientID %>');
- sy.value = diva.scrollTop;
- sx.value = diva.scrollLeft;
- }
-
- function GetResultFromServer() {
- var sx = document.getElementById('<%=dvscrollX.ClientID %>');
- var sy = document.getElementById('<%=dvscrollY.ClientID %>');
- //為什么div1就不用ClientID,其它服務器控件就要用?
- document.getElementById('div1').scrollTop = sy.value;
- document.getElementById('div1').scrollLeft = sx.value;
- }
- </script>
在頁面上添加兩個HiddenField,分別記錄X軸和Y軸滾動條坐標,這里有一個小細節(jié),因為我的頁面使用了UpdatePanel,所以在獲取HiddenField控件ID的時候,應該用這種寫法<%=dvscrollX.ClientID %>,如果不用UpdatePanel的話就直接寫dvscrollX即可,對于div而言不管用不用UpdatePanel,都可以直接寫成div1
- <asp:HiddenField ID="dvscrollX" runat="server" />
- <asp:HiddenField ID="dvscrollY" runat="server" />
GridView控件外側的div標記增加js代碼 onscroll="javascript:RecordPostion(this);"
- <div id="div1" style="overflow: auto; line-height: 100%; letter-spacing: 1pt; height: 150px; margin:5px" onscroll="javascript:RecordPostion(this);">
- <asp:GridView ID="GridView1" runat="server" Width="98%" AutoGenerateColumns="False" CssClass="gv" DataKeyNames="管線ID" OnRowCommand="GridView1_RowCommand" OnRowDataBound="GridView1_RowDataBound">
- <Columns>
- <asp:BoundField DataField="管線ID" HeaderText="管線ID" ReadOnly="true">
- <FooterStyle CssClass="hidden" />
- <HeaderStyle CssClass="hidden" />
- <ItemStyle HorizontalAlign="Center" CssClass="hidden" />
- </asp:BoundField>
- <asp:TemplateField HeaderText="主項號">
- <EditItemTemplate>
- <asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("主項號") %>'></asp:TextBox></EditItemTemplate>
- <ItemTemplate>
- <asp:Label ID="Label2" runat="server" Text='<%# Bind("主項號") %>'></asp:Label></ItemTemplate>
- <ItemStyle HorizontalAlign="Center" Width="120px" />
- </asp:TemplateField>
- <asp:TemplateField HeaderText="明細">
- <ItemTemplate>
- <p class="cai">
- <asp:LinkButton ID="lbDetails" runat="server" CommandArgument='<%# Eval("管線ID") %>' CommandName="Details" CausesValidation="False" Text="明細" />
- </p>
- </ItemTemplate>
- <HeaderStyle HorizontalAlign="Center" />
- <ItemStyle HorizontalAlign="Center" Width="50px"/>
- </asp:TemplateField>
- </Columns>
- <RowStyle CssClass="gv_row" />
- <AlternatingRowStyle CssClass="gv_alternet_row" />
- <SelectedRowStyle CssClass="gv_selected_row" />
- <HeaderStyle CssClass="gv_header" />
- </asp:GridView>
- </div>
后臺代碼- protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
- {
- string pipelineId = e.CommandArgument.ToString(); //獲取管線id
-
- if (e.CommandName == "Details") //查看明細
- {
- //做相應的操作...
-
- //加載js代碼,調(diào)用GetResultFromServer()方法
- string sjs = "GetResultFromServer();";
- ScriptManager.RegisterClientScriptBlock(this.GridView1, this.GetType(), "", sjs, true);
-
- }
- }
最后說明:問題解決思路來自 http://bbs.csdn.net/topics/330148083