جستجو و highlight کردن نتایج در GridView

highlight کردن نتایج در GridView

ASP.Net GridView کنترل بسیار قدرتمندی است که می تواند اطلاعات را با گزینه هایی مانند مرتب سازی و صفحه بندی نمایش دهد. “جستجو” یکی دیگر از امکاناتی است که اغلب GridView زمانی که شامل حجم زیادی داده است، نیاز دارد. به عنوان مثال، اگر مدیری بخواهد از طریق GridView ای که اطلاعات کارمندان را نمایش می دهد، اطلاعات شخصی را وارد کند که سوپروایزر می باشد، اگر کادر جستجویی در ستون نام کارمند وجود داشته باشد که او بتواند همان رکورد مشخص را پیدا کند، کارش راحت تر خواهد بود. در این مقاله پیاده سازی جستجوی نامتقارن و highlight کردن نتایج در GridView براساس هر ستون را توضیح می دهیم.

highlight کردن نتایج در GridView

منظور از جستجوی نامتقارن آپدیت کردن GridView با نتایج جستجو بدون reload کردن کل صفحه می باشد. بعد از اینکه مفهوم اولیه چگونگی پیاده سازی این ویژگی را یاد گرفتید، همچنین می توانید قابلیت جستجو در چند ستون را پیاده سازی نمایید.

برای این مثال از جدول mysql ای به نام “employee” و با ساختار زیر استفاده می کنیم.

highlight کردن نتایج در GridView

جدولی با ساختار بالا ایجاد می کنیم. این جدول لازم است چرا که ما قصد داریم قابلیت جستجو را روی ستون “name” این جدول فعال کنیم.

تمام محتوای صفحه .aspx را پاک کرده و کد زیر را در آن می نویسیم.

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
   <title>AJAX Search & Highlight in GridView</title>
<style type="text/css">
.highlight 
{
    text-decoration:none; 
    font-weight:bold;
    color:black; 
    background:yellow;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div>
    <h1>AJAX Search & Highlight in GridView</h1>
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <div>
                <asp:Label ID="lblAlert" runat="server" Visible="false" Text="There are no results matching your search input. Please try again with different input"></asp:Label>
                <asp:GridView ID="grdToSearch" runat="server"
                    BackColor="white" BorderColor="Aqua"
                    AutoGenerateColumns="false" ShowFooter="true"
                    OnRowCommand="grdToSearch_RowCommand">
                    <FooterStyle BackColor="DarkOrange"
                    ForeColor="AntiqueWhite" />
                    <PagerStyle BackColor="#99CCCC"
                    ForeColor="#003399" HorizontalAlign="Left" />
                    <HeaderStyle BackColor="DarkOrange"
                    Font-Bold="True" ForeColor="White" />

                <Columns>
                   <asp:BoundField DataField="id"
                         HeaderText="ID" />
                    <asp:TemplateField HeaderText="Name">
                    <ItemTemplate>
                    <asp:Label ID="lblFIrstName" runat="server" Text='<%# Highlight(Eval("name").ToString()) %>'>
                    </asp:Label>
                    </ItemTemplate>
                    <FooterTemplate>
                    <asp:TextBox ID="txtSearch" runat="server"
                         Width="70px"></asp:TextBox>
                    <asp:Button ID="btnSearch"
                                CommandName="Search"
                                runat="server" Text="Search"
                                Width="60px" />
                    <asp:Button ID="btnBack"
                                CommandName="Back"
                                runat="server" Text="Back" Visible="false"
                                Width="60px" />
                    </FooterTemplate>
                    </asp:TemplateField>
                      <asp:BoundField DataField="designation"
                         HeaderText="Designation" />
                          <asp:BoundField DataField="salary"
                         HeaderText="Salary" />
                </Columns>
                </asp:GridView>
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:UpdateProgress ID="UpdateProgress1" runat="server">
        <ProgressTemplate>
            

        <img src="Images/ajax-loading.gif" alt="Searching.. Please wait!"/>
        </ProgressTemplate>
    </asp:UpdateProgress>
</div>
</form>
</body>
</html>

در کد HTML بالا، از عنصر style برای اضافه کردن یک سری کد CSS برای highlight کردن عبارت جستجو شده در نتایج جستجو استفاده کردیم.

یک کنترل ScriptManager و UpdatePanel برای پیاده سازی Ajax در پیاده سازی جستجو اضافه می کنیم. توجه داشته باشید که GridView درون کنترل UpdateControl قرار می گیرد تا مطمئن باشیم که هر زمان کاربر روی دکمه جستجو کلیک کرد، تنها gridView در صفحه reload شود نه کل صفحه.

در GridView

یک lable برای نمایش پیغام هشدار برای زمانی که هیچ موردی برای عبارت جستجوشده یافت نشود، وجود دارد.

یک قالب footer، که معمولا شامل یک textbox، یک دکمه برای جستجو می باشد که وقتی کلیک شود، رویداد row_command مربوط به GridView را اجرا می کند و یک دکمه Back که به کاربر کمک می کند تا به صفحه اصلی نتایج برگردد (در حالت اولیه بارگزاری صفحه پنهان است و با نمایش دادن نتایج جستجو ظاهر می شود.)

یک قالب Item، که مقدار ستون name را به عنوان lable نمایش می دهد، زمانی که مقداری در ستون name نمایش داده شود، این آیتم مقادیر را در کادر جستجو بررسی می کند تا عبارت جستجو شده را در صورت وجود Highlight کند.

در نهایت، یک کنترل UpdateProgress برای نمایش پیشرفت عملیات جستجو اضافه می کنیم.

در قسمت code-behind فضای نام های زیر را اضافه می کنیم.

Using System.Data;
Using System.Text.RegularExpressions;

کدهای زیر را در قسمت code-behind می نویسیم:

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // Load gridview with data on page load
                BindGrid();
            }

        }

        private DataTable GetRecords()
        {
            try
            {
                //Fetch data from mysql database
                MySqlConnection conn = new MySqlConnection("server=localhost;uid=root;password=priya123;database=test; pooling=false;");
                conn.Open();
                string cmd = "select * from employee";                
                MySqlDataAdapter dAdapter = new MySqlDataAdapter(cmd,conn);
                DataSet objDs = new DataSet();
                dAdapter.Fill(objDs);
                return objDs.Tables[0];
            }
            catch (MySqlException ex)
            {
                System.Console.Error.Write(ex.Message);
                return null;
            }

        }
        private void BindGrid()
        {
            //Fetch data from mysql database
            DataTable dt = GetRecords();
            //Bind the fetched data to gridview
            grdToSearch.DataSource = dt;
            grdToSearch.DataBind();
               
            
        }

        private void SearchText(string strSearchText)
        {
            lblAlert.Visible = false;
            DataTable dt = GetRecords();
            DataView dv = new DataView(dt);
            string SearchExpression = null;
            if (!String.IsNullOrEmpty(strSearchText))
            {
                SearchExpression = string.Format("{0} '%{1}%'",
                grdToSearch.SortExpression, strSearchText);

            }
            dv.RowFilter = "name like" + SearchExpression;
            if (dv.Count > 0)
            {
                grdToSearch.DataSource = dv;
                grdToSearch.DataBind();
                // Enable button that allow users to get back to the main gridview
                Button backbutton = (Button)grdToSearch.FooterRow.FindControl("btnBack");
                backbutton.Visible = true;
            }
            else
            {
                //Display alert message when there are no matching search results
                lblAlert.Visible = true;
            }
        }

        protected void grdToSearch_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            System.Threading.Thread.Sleep(2000);
            if (e.CommandName == "Search")
            {
                TextBox txtGrid = (TextBox)grdToSearch.FooterRow.FindControl("txtSearch");
                SearchText(txtGrid.Text);
            }
            else if (e.CommandName == "Back")
            {
                BindGrid();
            }
        }

        public string Highlight(string InputTxt)
        {
            GridViewRow gvr = grdToSearch.FooterRow;
            if (gvr != null)
            {
                TextBox txtExample = (TextBox)grdToSearch.FooterRow.FindControl("txtSearch");

                if (txtExample.Text != null)
                {
                    string strSearch = txtExample.Text;
                    // Setup the regular expression 

                    Regex RegExp = new Regex(strSearch.Replace(" ", "|").Trim(),
                                   RegexOptions.IgnoreCase);


                    //Highlight keywords by calling the delegate 
                    //each time a keyword is found.
                    return RegExp.Replace(InputTxt, new MatchEvaluator(ReplaceKeyWords));

                }
                else
                    return InputTxt;
            }
            else
            {
                return InputTxt;
            }
        }

        public string ReplaceKeyWords(Match m)
        {
            return "<span class="highlight">" + m.Value + "</span>";
        }
    }

ترتیب اجرای کد و توضیح کدهای بالا:

ابتدا، ما GridView را با داده های آن در رویداد Page_Load بارگزاری می کنیم.

زمانی که کاربر روی دکمه جستجو در GridView کلیک می کند، رویداد row_Command مربوط به GridView اجرا می شود.

رویداد row_command نام دستور (CommandName) را که در این مثال “Search” می باشد بررسی می کند و اگر کاربر روی دکمه جستجو کلیک کرده باشد، متد SearchText() را فراخوانی می کند.

متد SearchText() درواقع وظیفه جستجو کردن را به عهدده دارد، این متد از RowFilter برای فیلتر کردن نتایج بر اساس ستون name استفاده می کند.

متد Highlight() وظیفه Highlight کردن متن را به عهده دارد. این متد با استفاده از Regular Expression مقدار درون کادر جستجو را با هر یک از رکوردهای GridView مطابقت می دهد و نتایج را با استفاده از کلاس Css که در صفحه .aspx استفاده شده، به رنگ زرد درمی آورد.

به این ترتیب جستجو در GridView پیاده سازی می شود و می توانیم برنامه را ا جرا کنیم.

موفق باشید !

  • پسورد: www.mspsoft.com
فاطمه زکایی

فاطمه زکایی هستم. فارغ التحصیل کارشناسی مهندسی نرم افزار، مدت سه سال هست که در زمینه توسعه اپلیکیشن های تحت وب و اندروید و همچنین تولید محتوای تخصصی برنامه نویسی تحت وب و اندروید در مجموعه mspsoft در خدمت شما هستم.

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.