Hi!!!
I have made a window application in which when a string is entered in textbox , the related links are displayed in listview.
Since ,there can be any number of links related to that string. So,I want to display only 5-7 links at a time in listview and on clicking on "NEXT" button it should display other links.But at a time there should be only 5-7 links in listview .Like in google search we have some links on one page and as we click on next we can see other links.Similar functionality I want in window application.
Can anyone help me in this.............. :pretty:
avirag 10 Posting Whiz
sknake 1,622 Senior Poster Featured Poster
Try something like this.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace daniweb.paging
{
public partial class Form1 : Form
{
private const int RECORDS_PER_PAGE = 10;
private List<string> lstAllLinks;
private List<string> currentSearchResults;
private int curPage;
private int maxPage;
public Form1()
{
InitializeComponent();
lstAllLinks = new List<string>();
currentSearchResults = new List<string>();
}
private void Form1_Load(object sender, EventArgs e)
{
for (int i1 = 0; i1 < 500; i1++)
{
lstAllLinks.Add(i1.ToString() + " - " + @"http://" + Guid.NewGuid().ToString() + ".com");
}
DoSearch();
}
private void DoSearch()
{
string term = textBox1.Text.Trim();
currentSearchResults.Clear();
if (string.IsNullOrEmpty(term)) //all results
{
currentSearchResults.AddRange(lstAllLinks.ToArray());
}
else
{
for (int i1 = 0; i1 < lstAllLinks.Count; i1++)
{
if (lstAllLinks[i1].IndexOf(term, StringComparison.CurrentCultureIgnoreCase) >= 0)
currentSearchResults.Add(lstAllLinks[i1]);
}
}
curPage = 1;
maxPage = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(((double)currentSearchResults.Count / (double)RECORDS_PER_PAGE))));
textBoxTotalPage.Text = maxPage.ToString();
DisplayResults();
}
private void DisplayResults()
{
textBoxCurrentPage.Text = curPage.ToString();
int recStart = 0 + (RECORDS_PER_PAGE * (curPage - 1));
int recEnd = recStart + RECORDS_PER_PAGE;
listView1.BeginUpdate();
listView1.Items.Clear();
for (int i1 = recStart; i1 < recEnd; i1++)
{
if (currentSearchResults.Count > i1)
listView1.Items.Add(currentSearchResults[i1]);
else
break;
}
listView1.EndUpdate();
buttonNextPage.Enabled = (curPage < maxPage);
buttonPrevPage.Enabled = (curPage > 1);
}
private void buttonSearch_Click(object sender, EventArgs e)
{
DoSearch();
}
private void buttonNextPage_Click(object sender, EventArgs e)
{
curPage++;
DisplayResults();
}
private void buttonPrevPage_Click(object sender, EventArgs e)
{
curPage--;
DisplayResults();
}
}
}
I have attached my sample project.
This attachment is potentially unsafe to open. It may be an executable that is capable of making changes to your file system, or it may require specific software to open. Use caution and only open this attachment if you are comfortable working with zip files.
Geekitygeek 480 Nearly a Posting Virtuoso
Hey sknake :) Great code, i just had one query. Is it better to manually loop through the array to find matches? I use predicates with the List.Find method. Is there any kind of performance boost for either approach?
sknake 1,622 Senior Poster Featured Poster
Either way is fine. I was just keeping it simple for the sake of readability.
Please mark this thread as solved if you have found an answer to your question and good luck!
avirag 10 Posting Whiz
Well thanks for your reply sknake....
Actually I tried reverse of this i.e. first searching a string and then display the search results 5 at a time .
I am searching the string "abc" and it should show 5 a time and click "next" to others.
My code is attached here which i have tried, Kindly help me in this.
This attachment is potentially unsafe to open. It may be an executable that is capable of making changes to your file system, or it may require specific software to open. Use caution and only open this attachment if you are comfortable working with zip files.
sknake 1,622 Senior Poster Featured Poster
I remeber this search code from somewhere ... ;)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CompareString
{
public partial class Form1 : Form
{
//
private const int RECORDS_PER_PAGE = 5;
//
private SearchResult[] currentSearchResults;
private int curPage;
private int maxPage;
//
public Form1()
{
InitializeComponent();
currentSearchResults = default(SearchResult[]);
}
private void buttonSearch_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(textBox1.Text.Trim()))
{
MessageBox.Show("Enter your search term");
textBox1.Focus();
return;
}
else
{
DoSearch();
}
}
private void DoSearch()
{
if (string.IsNullOrEmpty(textBox1.Text))
{
currentSearchResults = default(SearchResult[]);
}
else
{
FormSearcher fs = new FormSearcher();
fs.ExcludeTypes.Add(this.GetType());
currentSearchResults = fs.FindString(textBox1.Text);
}
curPage = 1;
maxPage = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(((double)currentSearchResults.Length / (double)RECORDS_PER_PAGE))));
textBoxTotalPage.Text = maxPage.ToString();
DisplayResults();
}
private void DisplayResults()
{
textBoxCurrentPage.Text = curPage.ToString();
int recStart = 0 + (RECORDS_PER_PAGE * (curPage - 1));
int recEnd = recStart + RECORDS_PER_PAGE;
listView1.BeginUpdate();
listView1.Items.Clear();
if (currentSearchResults != null)
{
for (int i1 = recStart; i1 < recEnd; i1++)
{
if (currentSearchResults.Length > i1)
{
ListViewItem lvi = listView1.Items.Add(currentSearchResults[i1].FormType.Name);
lvi.SubItems.Add(currentSearchResults[i1].Caption);
lvi.Tag = currentSearchResults[i1];
}
else
break;
}
}
listView1.EndUpdate();
buttonNext.Enabled = (curPage < maxPage);
buttonPrev.Enabled = (curPage > 1);
}
private void listView1_DoubleClick(object sender, EventArgs e)
{
if (listView1.SelectedItems.Count != 1)
return;
SearchResult sr = (SearchResult)listView1.SelectedItems[0].Tag;
using (Form f = (Form)Activator.CreateInstance(sr.FormType))
{
f.StartPosition = FormStartPosition.CenterParent;
f.ShowDialog();
}
}
private void buttonNext_Click(object sender, EventArgs e)
{
curPage++;
DisplayResults();
}
private void buttonPrev_Click(object sender, EventArgs e)
{
curPage--;
DisplayResults();
}
private void listView1_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}
This attachment is potentially unsafe to open. It may be an executable that is capable of making changes to your file system, or it may require specific software to open. Use caution and only open this attachment if you are comfortable working with zip files.
avirag 10 Posting Whiz
thanks a lot..........
avirag 10 Posting Whiz
hello Sknake......I need your help..........And this is one and the last problem related to this thread.........
I know its wrong to extend this thread , but I know you are only one who can help me out.
In my application I have made forms on which there are two panels each having a picturebox.
Here, when user enters the string in textbox for searching and the Text(caption) of the matched string are displayed.
But I want that it should display the image of picturebox1 of each matched form in the listview along with the caption. And when we click on image ,it should display the picturebox2 of that form(if possible) otherwise show the complete corresponding form.
Kindly help me ,please.............
This attachment is potentially unsafe to open. It may be an executable that is capable of making changes to your file system, or it may require specific software to open. Use caution and only open this attachment if you are comfortable working with zip files.
sknake 1,622 Senior Poster Featured Poster
Mark this thread as solved ... create a new ... and we'll go from there. Your requirements have changed. I normally say don't send me a private message but I have been busy lately and not checking all the threads so let me know when you start your new thread.
avirag 10 Posting Whiz
Mark this thread as solved ... create a new ... and we'll go from there. Your requirements have changed. I normally say don't send me a private message but I have been busy lately and not checking all the threads so let me know when you start your new thread.
Hi Sknake i started a new thread "Display the Results".
Kindly help me in that thread.............
Be a part of the DaniWeb community
We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.