支付宝
微信
扫描二维码打赏
更多详情(暂无)

C#服务控件UpdatePanel的局部刷新与属性AutoPostBack回传

  C#服务控件许多都有AutoPostBack这一属性(AutoPostBack意思是自动回传,也就是说此控件值更改后是否和服务器进行交互),如下代码所示:

      

       protected void Textbox1_TextChanged(object sender, EventArgs e)
        {
            TextBox txt = (TextBox)sender;
             var txt_text = txt.Text.Trim().Split(' ')[0];//获取修改后的文本(不包括后面的时间)
            txt.Text = txt_text + " " + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");//设置文本
        }

 

 其中textbox中的OnTextChanged事件,如果没有AutoPostBack=“true”的属性,该事件永远不会跟后台有交互(也就是永远不会进到方法Textbox1_TextChanged里面)

之后加入AutoPostBack属性后,终于能执行里面的代码,效果图如下:

    

  效果是实现了,但是细心的人会发现页面其实在刷新了(相当于手动给浏览器按F5了)。当页面上的数据量不是很大的时候,页面刷新非常快不细心的话根本看不出来;一旦数据量大了,刷新页面就会很慢。

这时候就需要UpdatePanel控件了(由于本人也是刚刚接触一系列服务控件,理解的也不是很多请见谅),直接上代码了。

 <asp:UpdatePanel runat="server" ID="UpdatePanel1" UpdateMode="Conditional">
            <ContentTemplate>
                <asp:DataGrid ID="dgData" runat="server" CssClass="GridViewStyle" DataKeyField="xh"
                    AllowSorting="True" AutoGenerateColumns="False" PageSize="10" Width="100%">
                    <FooterStyle CssClass="GridViewFooterStyle" />
                    <ItemStyle CssClass="GridViewRowStyle" />
                    <HeaderStyle CssClass="GridViewHeaderStyle" />
                    <PagerStyle Mode="NumericPages" CssClass="GridViewPagerStyle" />
                    <Columns>
                        <asp:BoundColumn HeaderText="院系" HeaderStyle-HorizontalAlign="Center" DataField="xsmc">
                        </asp:BoundColumn>
                        <asp:BoundColumn HeaderText="专业" HeaderStyle-HorizontalAlign="Center" DataField="zymc">
                        </asp:BoundColumn>
                        <asp:BoundColumn DataField="xh" HeaderText="学号" HeaderStyle-HorizontalAlign="Center">
                            <HeaderStyle Wrap="False"></HeaderStyle>
                            <ItemStyle Wrap="False" HorizontalAlign="Center"></ItemStyle>
                        </asp:BoundColumn>
                        <asp:BoundColumn DataField="xm" HeaderText="姓名" HeaderStyle-HorizontalAlign="Center">
                            <HeaderStyle Wrap="False"></HeaderStyle>
                            <ItemStyle Wrap="False" HorizontalAlign="Center"></ItemStyle>
                        </asp:BoundColumn>
                        <asp:TemplateColumn HeaderText="成绩属性" HeaderStyle-HorizontalAlign="Center">
                            <HeaderStyle Wrap="False"></HeaderStyle>
                            <ItemStyle Wrap="False" HorizontalAlign="Center"></ItemStyle>
                            <ItemTemplate>
                                <asp:Label ID="lblcjsx" runat="server" Text='<%# DataBinder.Eval(Container,"DataItem.cjsx")%>'>
                                </asp:Label>
                            </ItemTemplate>
                        </asp:TemplateColumn>
                        <asp:TemplateColumn HeaderStyle-Width="60" HeaderText="考核成绩" HeaderStyle-HorizontalAlign="Center"
                            ItemStyle-HorizontalAlign="Center">
                            <ItemTemplate>
                                <asp:TextBox ID="txtCJ" runat="server" MaxLength="5" Width="90%" AutoPostBack="true"
                                    OnTextChanged="txtCj_Change" CssClass="txtbox" Text='<%# DataBinder.Eval(Container,"DataItem.cj")%>'>
                                </asp:TextBox>
                            </ItemTemplate>
                        </asp:TemplateColumn>
                        <asp:TemplateColumn HeaderStyle-Width="60" HeaderText="考核成绩" HeaderStyle-HorizontalAlign="Center"
                            ItemStyle-HorizontalAlign="Center">
                            <ItemTemplate>
                                <asp:DropDownList ID="drpCJ" runat="server">
                                </asp:DropDownList>
                            </ItemTemplate>
                        </asp:TemplateColumn>
                        <asp:BoundColumn DataField="id" Visible="False"></asp:BoundColumn>
                        <asp:BoundColumn DataField="cj" Visible="False"></asp:BoundColumn>
                    </Columns>
                </asp:DataGrid>
            </ContentTemplate>
        </asp:UpdatePanel>

 

UpdatePanel控件下面ContentTemplate基本上可以放任何控件,设置UpdateMode属性为Conditional,设置控件下面的一个控件进行回传的话就会像前端Ajax一样实现局部刷新而不会进行全页面的刷新。

 

     //局部更新数据
        protected void txtCj_Change(object sender, EventArgs e)
        {
            TextBox txtCJ = (TextBox)sender;
            var cj = txtCJ.Text.Trim();//考核成绩
            decimal temp;
            if (Decimal.TryParse(cj, out temp) && temp <= 100 && temp >= 0)
            {
                DataGridItem dgItem = (DataGridItem)txtCJ.Parent.Parent;
                this.SaveCJ(dgItem, txtCJ);
            }
            else
            {
                //txtCJ.Focus();
                txtCJ.BackColor = Color.YellowGreen;
                //PageCtrl.ShowMessage(this, "考核成绩出现非法数据(绿色标记部分),请修正!");
                ScriptManager.RegisterClientScriptBlock(UpdatePanel1, UpdatePanel1.GetType(), "xz", "alert('保存出错')", true);
            }
        }

 

 值得注意的是,当使用UpdatePanel控件时注册JS的一些方法许多都不能使用(如 response.write(string script),this.RegisterStartupScript(string key, string script)等),要使用

ScriptManager.RegisterClientScriptBlock(Control control, Type type, string key, string script, bool addScriptTags)进行JS的注册,否则的话UpdatePanel异步执行不会执行里面的JS

 

posted @ 2017-09-21 15:31  华临天下  阅读(1917)  评论(2编辑  收藏  举报