zoukankan      html  css  js  c++  java
  • ASP.NET分页控件

    效果图

    这个在用户控件一用一次

    <%@ Register Assembly="Uni2Uni.ERP.Common" Namespace="Uni2Uni.ERP.Common.PageBar"
        TagPrefix="cc1" %>
    <cc1:PageBar ID="pageBar" runat="server" Mode="Post" />

    然后使用那个用户控件

    <uc1:PageBarControl ID="PageBarControl1" runat="server" />
    
    
    PageBarControl1.PageBar.Click += new EventHandler(PagerChange);
            
    
            private void PagerChange(object sender, EventArgs e)
            {
                var queryEntity = ViewState["queryEntity"] as DamagedQueryEntity;
                GetPageData(queryEntity, false);
            }
    
    
     private void GetPageData(DamagedQueryEntity queryEntity, bool bFirst = true)
            {
                if (bFirst)
                    PageBarControl1.PageBar.CurrentIndex = 1;
                int totalCount;
                var list = bll.GetDamagedOrderPage(PageBarControl1.PageBar.CurrentIndex, PageBarControl1.PageBar.Size, out totalCount, queryEntity);
                this.PageBarControl1.PageBar.Total = totalCount;
                this.bindData.DataSource = list;
                this.bindData.DataBind();
            }
    


     

    源码

    using System;
    using System.Collections.Specialized;
    using System.ComponentModel;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    
    [assembly: WebResource("Uni2Uni.ERP.Common.PageBar.PageBar.css", "text/css", PerformSubstitution = true)]
    
    namespace Uni2Uni.ERP.Common.PageBar
    {
        public enum PageBarMode
        {
            Get,
            Post
        }
    
        #region - PageBar -
    
        /// <summary>
        /// 分页控件
        /// </summary>
        [ToolboxData("<{0}:PageBar runat="server" />")]
        [DefaultEvent("Click")]
        [DefaultProperty("Size")]
        public sealed class PageBar : WebControl, IPostBackEventHandler
        {
            #region - Properties -
    
            #region = Total =
    
            /// <summary>
            /// 总共有多少记录集合
            /// </summary>
            /// <value>The total.</value>
            [Category("Data"), Description("总共有多少记录集合")]
            public int Total
            {
                get
                {
                    object o = ViewState["Total"];
                    return o == null ? 0 : (int)o;
                }
                set { ViewState["Total"] = value; }
            }
    
            #endregion
    
            #region = CurrentIndex =
    
            /// <summary>
            /// 当前使用的页面
            /// </summary>
            /// <value>The index of the current.</value>
            [Category("Data"), Description("当前使用的页面")]
            public int CurrentIndex
            {
                get
                {
                    object o = ViewState["CurrentIndex"];
                    int _currentindex = ((o == null) ? 0 : (int)o);
                    if (_currentindex == 0)
                    {
                        _currentindex = 1;
    
                        if (string.IsNullOrEmpty(UrlFormatString) == false)
                        {
                            string url = Page.Request.Url.ToString();
                            string urlformat = string.Format(UrlFormatString, @"(d+)");
                            urlformat = urlformat.Replace("?", "\?");
                            urlformat = Regex.Replace(urlformat, "#.+$", string.Empty);
    
                            Match m = Regex.Match(url, urlformat, RegexOptions.IgnoreCase);
    
                            if (m.Success)
                            {
                                string value = m.Groups[1].Value;
                                if (string.IsNullOrEmpty(value) == false)
                                {
                                    _currentindex = int.Parse(value);
                                }
                            }
                        }
                        else
                        {
                            if (Page.Request.QueryString[QueryStringKey] != null)
                            {
                                int.TryParse(Page.Request.QueryString[QueryStringKey], out _currentindex);
                            }
                        }
                    }
                    return _currentindex;
                }
                set { ViewState["CurrentIndex"] = value; }
            }
    
            #endregion
    
            #region = Size =
    
            /// <summary>
            /// 每个页面显示多少记录集合
            /// </summary>
            /// <value>The size.</value>
            [Category("Data"), Description("每个页面显示多少记录集合")]
            public int Size
            {
                get
                {
                    object o = ViewState["Size"];
                    return o == null ? 10 : (int)o;
                }
                set { ViewState["Size"] = value; }
            }
    
            #endregion
    
            #region = Displaysize =
    
            /// <summary>
            /// 显示页脚,控件显示多少页面数
            /// </summary>
            /// <value>The displaysize.</value>
            [Category("Data"), Description("控件显示多少页面数")]
            public int Displaysize
            {
                get
                {
                    object o = ViewState["Displaysize"];
                    return o == null ? 10 : (int)o;
                }
                set { ViewState["Displaysize"] = value; }
            }
    
            #endregion
    
            #region = Unit =
    
            /// <summary>
            /// 记录的单位
            /// </summary>
            /// <value>The unit.</value>
            [Category("Appearance"), Description("记录的单位")]
            public string Unit
            {
                get
                {
                    object o = ViewState["Unit"];
                    return o == null ? string.Empty : (string)o;
                }
                set { ViewState["Unit"] = value; }
            }
    
            #endregion
    
            #region = UrlFormatString =
    
            [
                Category("Property"),
                Description("获取或设置 URL 显示格式。"),
                DefaultValue("")
            ]
            public string UrlFormatString
            {
                get
                {
                    object o = ViewState["UrlFormatString"];
                    return o == null ? string.Empty : (string)o;
                }
                set { ViewState["UrlFormatString"] = value; }
            }
    
            #endregion
    
            #region = QueryStringKey =
    
            /// <summary>
            /// 传递值是使用的关键字
            /// </summary>
            /// <value>The query string key.</value>
            [Description("传递值是使用的关键字"), DefaultValue("page")]
            public string QueryStringKey
            {
                get
                {
                    object o = ViewState["QueryStringKey"];
                    return o == null ? "page" : (string)o;
                }
                set { ViewState["QueryStringKey"] = value; }
            }
    
            #endregion
    
            #region = 跳转的页数 =
            /// <summary>
            /// 跳转的页数
            /// </summary>
            [Browsable(true)]
            [Bindable(true, BindingDirection.TwoWay)]
            [DefaultValue("")]
            [Localizable(true)]
            [PersistenceMode(PersistenceMode.EncodedInnerDefaultProperty)]
            [Description("跳转的页数")]
            public string Text
            {
                get
                {
                    return ViewState["Text"] == null ? "" : ViewState["Text"].ToString();
                }
                set
                {
                    ViewState["Text"] = value;
                }
            }
            #endregion
    
            #region = Format =
    
            /// <summary>
            /// 数字格式化
            /// </summary>
            /// <value>The format.</value>
            [Description("数字格式化"), DefaultValue("")]
            public string Format
            {
                get
                {
                    object o = ViewState["Format"];
                    return o == null ? string.Empty : (string)o;
                }
                set { ViewState["Format"] = value; }
            }
    
            #endregion
    
            #region = NextPageImageUrl =
    
            /// <summary>
            /// 下一页图片路径
            /// </summary>
            /// <value>The next page image URL.</value>
            [Description("下一页图片路径"), DefaultValue("")]
            public string NextPageImageUrl
            {
                get
                {
                    object o = ViewState["NextPageImageUrl"];
                    return o == null ? string.Empty : (string)o;
                }
                set { ViewState["NextPageImageUrl"] = value; }
            }
    
            #endregion
    
            #region = LastPageImageUrl =
    
            private string _lastimage = string.Empty;
    
            /// <summary>
            /// 上一页图片路径
            /// </summary>
            /// <value>The last page image URL.</value>
            [Description("上一页图片路径"), DefaultValue("")]
            public string LastPageImageUrl
            {
                get
                {
                    object o = ViewState["LastPageImageUrl"];
                    return o == null ? string.Empty : (string)o;
                }
                set { ViewState["LastPageImageUrl"] = value; }
            }
    
            #endregion
    
            #region = Mode =
    
            [
                Category("Property"),
                Description("Pagebar的模式"),
                DefaultValue("")
            ]
            public PageBarMode Mode
            {
                get
                {
                    object o = ViewState["Mode"];
                    return o == null ? PageBarMode.Get : (PageBarMode)o;
                }
                set { ViewState["Mode"] = value; }
            }
    
            #endregion
    
            #region = ValidationGroup =
    
            [Category("Behavior"), DefaultValue(""), Themeable(false), Description("PostBackControl_ValidationGroup")]
            public string ValidationGroup
            {
                get
                {
                    var text1 = (string)ViewState["ValidationGroup"];
                    if (text1 != null)
                    {
                        return text1;
                    }
                    return string.Empty;
                }
                set { ViewState["ValidationGroup"] = value; }
            }
    
            #endregion
    
            #region = CausesValidation =
    
            /// <summary>
            /// 获取或设置一个值,该值指示在单击 LinkButton 控件时是否执行验证。 
            /// </summary>
            /// <value><c>true</c> if [causes validation]; otherwise, <c>false</c>.</value>
            [Category("Behavior"), Themeable(false), Description("Button_CausesValidation"), DefaultValue(true)]
            public bool CausesValidation
            {
                get
                {
                    object obj1 = ViewState["CausesValidation"];
                    if (obj1 != null)
                    {
                        return (bool)obj1;
                    }
                    return true;
                }
                set { ViewState["CausesValidation"] = value; }
            }
    
            #endregion
    
            #region = Target =
    
            /// <summary>
            /// Gets or sets the target.
            /// </summary>
            /// <value>The target.</value>
            [
                Category("Navigation"),
                TypeConverter(typeof(TargetConverter)),
                DefaultValue(""),
                Description("HyperLink_Target")]
            public string Target
            {
                get
                {
                    var text1 = (string)ViewState["Target"];
                    if (text1 != null)
                    {
                        return text1;
                    }
                    return "_self";
                }
                set { ViewState["Target"] = value; }
            }
    
            #endregion
    
            #endregion
    
            #region - Event -
    
            #region = OnClick =
    
            private static readonly object EventClick = new object();
    
            [Description("PageBar_OnClick"), Category("Action")]
            public event EventHandler Click
            {
                add { Events.AddHandler(EventClick, value); }
                remove { Events.RemoveHandler(EventClick, value); }
            }
    
            #endregion
    
            #endregion
    
            #region = OnPreRender =
    
            /// <summary>
            /// Raises the <see cref="E:System.Web.UI.Control.PreRender"></see> event.
            /// </summary>
            /// <param name="e">An <see cref="T:System.EventArgs"></see> object that contains the event data.</param>
            protected override void OnPreRender(EventArgs e)
            {
                base.OnPreRender(e);
    
                string cssKey = "PageBarCss";
    
                if (Page == null || Page.Header == null)
                {
                    return;
                }
                if (string.IsNullOrEmpty(CssClass))
                {
                    CssClass = "PageBar";
                }
                if (Page.Header.FindControl(cssKey) == null && CssClass == "PageBar")
                {
                    string css = Page.ClientScript.GetWebResourceUrl(GetType(), "Uni2Uni.ERP.Common.PageBar.PageBar.css");
                    var hl = new HtmlLink();
                    hl.ID = cssKey;
                    hl.Href = css;
                    hl.Attributes["type"] = "text/css";
                    hl.Attributes["rel"] = "stylesheet";
    
                    //this.Page.Header.Controls.Add(hl);
    
                    CssClass = "PageBar";
                }
            }
    
            #endregion
    
            #region = RenderContents =
    
            /// <summary>
            /// Renders the contents of the control to the specified writer. This method is used primarily by control developers.
            /// </summary>
            /// <param name="writer">A <see cref="T:System.Web.UI.HtmlTextWriter"></see> that represents the output stream to render HTML content on the client.</param>
            protected override void RenderContents(HtmlTextWriter writer)
            {
                base.RenderContents(writer);
    
                #region - Valid -
    
                if (IsEnabled == false)
                {
                    return;
                }
    
                if (Size == 0 || Displaysize == 0)
                {
                    return;
                }
    
                #endregion
    
                if (Total > 0 && CurrentIndex > 0)
                {
                    double dPageCount = 1.0 * Total / Size;
                    int PageCount = Convert.ToInt32(Math.Ceiling(dPageCount)); //共多少页
    
                    PostBackOptions options = GetPostBackOptions("{0}");
                    string srt = Page.ClientScript.GetPostBackEventReference(options, true);
    
                    //---【新添加】
                    //只能输入正整数
                    string js = "<script type="text/javascript">var postbackstring="" + srt + "";var total=" + PageCount + "; function PositiveInteger(element, keyCode) {if (keyCode == 9 || keyCode == 116 || (keyCode >= 35 && keyCode <= 40)) {return true;}if ($(element).val().length == 0 && (keyCode == 96 || keyCode==48)){return false;}return (keyCode >= 96 && keyCode <= 105 || keyCode == 8 || (keyCode >= 48 && keyCode <= 57));}function validatePage(element){if($("#goPage").val()==""){alert("请输入跳转页数。");return false;}if($("#goPage").val()>total){alert("跳转页数不能大于总页数。");return false;}$(element).attr("href",postbackstring.replace("{0}",$("#goPage").val()));return true;}</script>";
                    writer.Write(js);
    
                    if (CurrentIndex > PageCount)
                    {
                        CurrentIndex = PageCount;
                    }
    
                    //总共2784主题
                    writer.Write(PageBarResource.Total);
                    //writer.Write("总共");
                    writer.Write(" ");
                    writer.RenderBeginTag(HtmlTextWriterTag.Label);
                    writer.Write(Total.ToString(Format));
                    writer.RenderEndTag();
                    writer.Write(Unit);
                    writer.Write(", ");
    
                    writer.Write(PageBarResource.Page);
                    //writer.Write("当前");
                    writer.Write(" ");
                    writer.RenderBeginTag(HtmlTextWriterTag.Label);
                    writer.Write(CurrentIndex.ToString(Format));
                    writer.RenderEndTag();
                    writer.Write("/");
                    writer.RenderBeginTag(HtmlTextWriterTag.Label);
                    writer.Write(PageCount.ToString(Format));
                    writer.RenderEndTag();
    
                    if (PageCount > 1)
                    {
                        writer.Write(",");
                        int PagerGroup = Convert.ToInt32(Math.Ceiling(1.0 * PageCount / Displaysize)); //共多少页组
                        int CurrentGroup = (CurrentIndex - 1) / Displaysize + 1; //当前页组
    
                        int displaystart = (CurrentGroup - 1) * Displaysize + 1;
                        int displayend = displaystart + Displaysize;
    
                        if (displayend > (PageCount + 1))
                        {
                            displayend = PageCount + 1;
                        }
    
                        #region 显示后三的算法----------【新添加】
                        ////显示后三的算法----------【新添加】
                        //if (PageCount > Displaysize && CurrentIndex > Displaysize - 3)
                        //{
                        //    displaystart = CurrentIndex - (Displaysize - 4);
                        //    displayend = CurrentIndex + 4;
                        //    if (displayend - 1 >= PageCount)
                        //    {
                        //        displayend = PageCount + 1;
                        //    }
                        //} 
                        #endregion
    
    
                        //显示中间的算法----------【新添加】
                        if (PageCount > Displaysize && CurrentIndex >= Displaysize - ((Displaysize / 2) - 1))
                        {
                            displaystart = CurrentIndex - (Displaysize - (Displaysize / 2));
                            displayend = CurrentIndex + (Displaysize / 2);
                            if (displayend - 1 >= PageCount)
                            {
                                displayend = PageCount + 1;
                            }
                        }
    
                        //首页-------【新添加】
                        if (CurrentIndex != 1)
                        {
                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                            LinkText("【首页】", 1, writer);
                            writer.RenderEndTag();
                        }
                        else
                        {
                            //---【新添加】
                            writer.RenderBeginTag(HtmlTextWriterTag.Label);
                            writer.Write("【首页】");
                            writer.RenderEndTag();
                        }
                        //上一页
                        if (CurrentIndex > 1)
                        {
                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                            if (string.IsNullOrEmpty(LastPageImageUrl))
                            {
                                LinkText(PageBarResource.Previous, CurrentIndex - 1, writer);
                                //LinkText("【上一页】", this.CurrentIndex - 1, writer);
                            }
                            else
                            {
                                LinkText(
                                    "<img alt="" + PageBarResource.Previous + "" src="" + LastPageImageUrl + "" />",
                                    CurrentIndex - 1, writer);
                                //LinkText("<img alt="" +"【上一页】" + "" src="" + this.LastPageImageUrl + "" />", this.CurrentIndex - 1, writer);
                            }
                            writer.RenderEndTag();
                        }
                        else  
                        {
                            //---【新添加】
                            writer.RenderBeginTag(HtmlTextWriterTag.Label);
                            writer.Write("【上一页】");
                            writer.RenderEndTag();
                        }
    
                        //上一组
                        if (CurrentGroup > 1 || displaystart != 1)
                        {
                            writer.AddAttribute(HtmlTextWriterAttribute.Title, "上"+Displaysize+"页");
                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                            int index = CurrentIndex - Displaysize;
                            if (index < 1)
                            {
                                index = 1;
                            }
                            LinkText("<<", index, writer);
                            writer.RenderEndTag();
                        }
                        else
                        {
                            //---【新添加】
                            writer.RenderBeginTag(HtmlTextWriterTag.Label);
                            writer.Write("<<");
                            writer.RenderEndTag();
                        }
                        string attr = string.Empty;
    
                        //显示数字
                        for (int i = displaystart; i < displayend; i++)
                        {
                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                            if (i != CurrentIndex)
                            {
                                LinkText(i.ToString() + " ", i, writer);
                            }
                            else
                            {
                                //当前页
                                writer.RenderBeginTag(HtmlTextWriterTag.Label);
                                writer.Write(i + " ");
                                writer.RenderEndTag();
                            }
                            writer.RenderEndTag();
                        }
    
                        
                        //下一组
                        if (displayend - 1 < PageCount)
                        {
                            writer.AddAttribute(HtmlTextWriterAttribute.Title, "下" + Displaysize + "页");
                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                            int index = CurrentIndex + Displaysize;
                            if (index > PageCount)
                            {
                                index = PageCount;
                            }
                            LinkText(">>", index, writer);
                            writer.RenderEndTag();
                        }
                        else
                        {
                            //---【新添加】
                            writer.RenderBeginTag(HtmlTextWriterTag.Label);
                            writer.Write(">>");
                            writer.RenderEndTag();
                        }
    
                        //下一页
                        if (CurrentIndex < PageCount)
                        {
                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                            if (string.IsNullOrEmpty(NextPageImageUrl))
                            {
                                LinkText(PageBarResource.Next, CurrentIndex + 1, writer);
                                //LinkText("【下一页】", this.CurrentIndex + 1, writer);
                            }
                            else
                            {
                                LinkText("<img alt="" + PageBarResource.Next + "" src="" + NextPageImageUrl + "" />",
                                         CurrentIndex + 1, writer);
                                //LinkText("<img alt="" + "【下一页】" + "" src="" + this.NextPageImageUrl + "" />", this.CurrentIndex + 1, writer);
                            }
                            writer.RenderEndTag();
                        }
                        else
                        {
                            //---【新添加】
                            writer.RenderBeginTag(HtmlTextWriterTag.Label);
                            writer.Write("【下一页】");
                            writer.RenderEndTag();
                        }
    
                        //尾页-------【新添加】
                        if (CurrentIndex != PageCount)
                        {
                            writer.RenderBeginTag(HtmlTextWriterTag.Span);
                            LinkText("【尾页】", PageCount, writer);
                            writer.RenderEndTag();
                        }
                        else
                        {
                            //---【新添加】
                            writer.RenderBeginTag(HtmlTextWriterTag.Label);
                            writer.Write("【尾页】");
                            writer.RenderEndTag();
                        }
    
    
                        //跳转---【新添加】
                        if (PagerGroup > 1)
                        {
                            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
                            writer.AddAttribute(HtmlTextWriterAttribute.Id, "goPage");
                            writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);
                            writer.AddAttribute("onkeydown", "return PositiveInteger(this,event.keyCode);");
                            writer.AddStyleAttribute(HtmlTextWriterStyle.Height, "10px");
                            writer.AddStyleAttribute(HtmlTextWriterStyle.Width, "40px");
                            writer.AddStyleAttribute(HtmlTextWriterStyle.Position, "relative");
                            writer.AddStyleAttribute(HtmlTextWriterStyle.Top, "4px");
                            writer.AddAttribute(HtmlTextWriterAttribute.Maxlength, PageCount.ToString().Length.ToString());
                            writer.RenderBeginTag(HtmlTextWriterTag.Input);
                            writer.RenderEndTag();
    
                            writer.AddAttribute("onclick", "return validatePage(this);");
                            writer.AddAttribute(HtmlTextWriterAttribute.Href, "javascript:void(0)");
                            writer.RenderBeginTag(HtmlTextWriterTag.A);
                            writer.Write("【跳转】");
                            writer.RenderEndTag();
                        }
    
                    }
                }
                else
                {
                    Visible = false;
                }
            }
    
            #endregion
    
            #region - LinkText -
    
            private void LinkText(string text, int index, HtmlTextWriter write)
            {
                var strHtml = new StringBuilder();
                //href
                if (Mode == PageBarMode.Get)
                {
                    #region = 获取和解析当前的url =
    
                    if (string.IsNullOrEmpty(UrlFormatString))
                    {
                        strHtml.Append(UrlHelper.Current.Path);
                        strHtml.Append("?");
                        NameValueCollection querys = Page.Request.QueryString;
    
                        foreach (string s in querys.Keys)
                        {
                            if (s != QueryStringKey)
                            {
                                strHtml.AppendFormat("{0}={1}&", s, Page.Server.UrlEncode(querys[s]));
                            }
                        }
    
                        strHtml.AppendFormat("{0}={1}", QueryStringKey, index);
                    }
                    else
                    {
                        strHtml.AppendFormat(UrlFormatString, index);
                    }
    
                    #endregion
                }
                else
                {
                    PostBackOptions options = GetPostBackOptions(index.ToString());
    
                    string js = null;
                    if (options != null)
                    {
                        js = Page.ClientScript.GetPostBackEventReference(options, true);
                    }
                    if (string.IsNullOrEmpty(js))
                    {
                        js = "javascript:void(0)";
                    }
                    strHtml.Append(js);
                }
    
                //text
                write.AddAttribute(HtmlTextWriterAttribute.Href, strHtml.ToString());
                if (Mode == PageBarMode.Get)
                {
                    write.AddAttribute(HtmlTextWriterAttribute.Target, Target);
                }
                write.RenderBeginTag(HtmlTextWriterTag.A);
                write.Write(text);
                write.RenderEndTag();
            }
    
            #endregion
    
            #region - GetPostBackOptions -
    
            private PostBackOptions GetPostBackOptions(string index)
            {
                var options1 = new PostBackOptions(this, index);
                options1.RequiresJavaScriptProtocol = true;
    
                if (CausesValidation && (Page.GetValidators(ValidationGroup).Count > 0))
                {
                    options1.PerformValidation = true;
                    options1.ValidationGroup = ValidationGroup;
                }
                return options1;
            }
    
            #endregion
    
            #region - OnClick -
    
            private void OnClick(EventArgs e)
            {
                var handler1 = (EventHandler)base.Events[EventClick];
                if (handler1 != null)
                {
                    handler1(this, e);
                }
            }
    
            #endregion
    
            #region IPostBackEventHandler Members
    
            public void RaisePostBackEvent(string eventArgument)
            {
                if (CausesValidation)
                {
                    Page.Validate(ValidationGroup);
                }
    
                int _currentindex;
                if (int.TryParse(eventArgument, out _currentindex))
                {
                    CurrentIndex = _currentindex;
                }
    
                OnClick(EventArgs.Empty);
            }
    
            #endregion
        }
    
        #endregion
    }


     

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    108. Convert Sorted Array to Binary Search Tree
    111. Minimum Depth of Binary Tree
    49. Group Anagrams
    使用MALTAB标定实践记录
    442. Find All Duplicates in an Array
    522. Longest Uncommon Subsequence II
    354. Russian Doll Envelopes
    opencv 小任务3 灰度直方图
    opencv 小任务2 灰度
  • 原文地址:https://www.cnblogs.com/pangblog/p/3395407.html
Copyright © 2011-2022 走看看