15. juli 2008 - 20:35Der er
27 kommentarer og 1 løsning
Auto søgning
Hej alle sammen
Jeg vil lave en søgning i et program, som jeg er ved at lave, men man skal ikke klikke på en knap først, men i stedet skal der findes oplysninger ud fra hvad man skriver, f.eks. ligesom i Winamp, hvor at man skriver noget og ALT som hedder det man skriver bliver vist.
F.eks. hvis man ikke kan huske hvordan at Microsoft skrives, kan man bare skrive "soft" og søgningen finder ALT som indeholder ordet "soft".
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Jeg skal hente oplysninger fra en Access database. Brugeren skal indstate noget i boksen, som du skriver, men skal ALT først hentes fra databasen eller hvordan gøres det?
Du kan evt. også lave en webservice, der kalder din database. Denne service kan du så kalde via javascript og AJAX. På den måde kan du opnå effekten af "live" search hvor søgeresultatet bliver vist i takt med, at brugeren indtaster i tekstfeltet.
Denne løsning er lidt mere kompliceret (men faktisk ikke så svær), men den giver klart en bedre brugeroplevelse.
Følgende er et eksempel på, hvordan det kan gøres. Koden går ud fra at du har oprettet en form der hedder Form2. At du har en TextBox på formen som hedder textBox1. Og til sidst en ListBox som hedder listBox1. Derudover skal du endre stien til mdb filen. Du skal endre tabelnavnet så det passer med din database, og du skal endre kolonnenavnet så det passer med den kolonne i tabellen der skal søges i. I eksemplet herunder hedder kolonnen "name".
Eksemplet bruger en sql query til at søge i databasen, hver gang teksten i tekstboksen ændres.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Windows.Forms; using System.Data.OleDb;
namespace Test { public partial class Form2 : Form { public Form2() { InitializeComponent();
textBox1.TextChanged += new EventHandler(textBox1_TextChanged); connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\temp\db1.mdb;User Id=admin;Password=;"); command = connection.CreateCommand(); command.CommandText = "select * from Sheet1 where name like @seachString"; searchParam = new OleDbParameter("@searchString", "%%"); command.Parameters.Add(searchParam); adapter = new OleDbDataAdapter(command);
Undskyld ventetiden, jeg har arbejdet den sidste uge. Jeg har nu prøvet at få din kode til at virke, men når at jeg tester den, så kommer den med en fejl, fejlen er her: http://www.darkskies.dk/fejl.jpg
I din kode har du denne linie: using System.Collections.Generic;
Den kan jeg ikke finde i min kode, og hvis jeg indsætter den, så meldes der fejl.
everclear: Det er en runtime fejl, hvis det havde noget med Generics at gøre, ville der komme en compile fejl. Desuden bliver der ikke brugt generics i koden.
Fejlen på billedet har intet med generics at gøre nej; men det har den fejl, der bliver beskrevet i kommentaren: "I din kode har du denne linie: using System.Collections.Generic;
Den kan jeg ikke finde i min kode, og hvis jeg indsætter den, så meldes der fejl."
Så er der jo lige pludselig tale om en DB-fejl, hvilket jo kan skyldes lidt af hvert. Har du prøvet at "steppe" dig igennem koden via debug og set på dine værdier?
Kontroller at du har stavet tabelnavnet rigtigt i sql-queryen. Kontroller at stien til Access filen er rigtig. Du kan få en mere detaljeret fejlbeskrivelse frem ved at putte en try-catch statement rundt om den kodelinje som fejler, sådan:
Hvis du ikke finder ud af det, så copy/paste koden ind her, så vi kan se på det. Skriv også lidt information om database (tabelnavne, kolonnenavne osv)
Det var min fejl, jeg havde glemt at lægge databasen ind under debug mappen, hvor kan man være dum :) Men hvis man skriver noget i boksen som findes i databasen, så kommer der til at stå: System.Data.DataRowView
Men hvis man indstaster noget som ikke findes i databasen, så sker der intet.
Jeg havde markeret den ud, men det virker nu, men hvis jeg indtaster noget, så virker det, men hvis jeg sletter det som jeg har skrevet noget, så bliver ALT vist i listboxen fra databasen.
En sidste ting. Hvis man vil have den til at søge i 2 forskellige tabelnavne, hvordan gør man det i C#?
De oplysninger man får frem i listboxen, kan man gøre sådan at man kan dobbelt klikke på oplysningen og få en nyt vindue frem, men med flere oplysninger?
Der er praktisk talt ingen begrænsninger på, hvad du kan hente op fra databasen, og på hvilke tidspunkter.
SelectedItem propertien på ListBox kontrollen vil til enhver tid indeholde den DataRow som du har valgt i ListBoxen. Du kan abonnere på DoubleClick eventet, og ud fra informationerne i SelectedItem propertien, kan du hente nye informationer op fra databasen og vise på et nyt vindue.
Men, læs lidt om ADO.NET og SQL, det vil hjælpe dig meget, når du skal kommunikere med en database. Det du lige har fået til at virker, bruger ADO.NET (OleDbConnection, OleDbCommand og OleDbDataAdapter er klasser fra ADO.NET rammeværket).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.