Avatar billede trekkies Juniormester
15. juli 2008 - 20:35 Der 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".

Det er til en windows application.
Avatar billede aaberg Nybegynder
15. juli 2008 - 20:50 #1
Hvor skal du hente oplysningerne fra? Hvis du henter fra en SQL database, kan du bruge en sql-sætning ala:

select *
from minTabel
where minKolonne like '%søgetext%'

Hvis du vil have den til at gøre det realtime når brugeren taster noget i en textbox, kan du lytte på textboksens TextChanged event.
Avatar billede trekkies Juniormester
15. juli 2008 - 21:31 #2
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?
Avatar billede trekkies Juniormester
15. juli 2008 - 22:21 #3
Jeg vil prøve dit forslag med TextChanged event, men det bliver først på torsdag, da jeg skal på arbejde i morgen.
Avatar billede everclear Praktikant
15. juli 2008 - 22:58 #4
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.
Avatar billede everclear Praktikant
15. juli 2008 - 22:59 #5
Ahr missede lige det med windows-applikationen:-) Well...dele af den tidligere kommentar gælder stadig:-)
Avatar billede aaberg Nybegynder
15. juli 2008 - 23:12 #6
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);

            this.listBox1.DisplayMember = "name";
        }

        OleDbConnection connection;
        OleDbCommand command;
        OleDbParameter searchParam;
        OleDbDataAdapter adapter;

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            searchParam.Value = "%" + this.textBox1.Text + "%";

            DataTable dt = new DataTable();
            adapter.Fill(dt);

            this.listBox1.DataSource = dt;
        }
    }
}
Avatar billede trekkies Juniormester
23. juli 2008 - 19:13 #7
Hej igen

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.
Avatar billede everclear Praktikant
23. juli 2008 - 19:25 #8
Hvilken version af C# bruger du? Kunne tyde på, at du bruger en tidligere version hvor generic collections ikke er med.
Avatar billede trekkies Juniormester
23. juli 2008 - 20:03 #9
Jeg bruger Visual Studio 2003.
Avatar billede everclear Praktikant
23. juli 2008 - 20:59 #10
Så er det ihvertfald derfor du får en fejl når du prøver at bruge generiske collections, da disse først blev introduceret med C# 2.0.
Avatar billede aaberg Nybegynder
23. juli 2008 - 21:06 #11
Det er lidt mærkeligt at du får den fejl! Jeg har desværre ikke nogen VS2003 version at teste det på!

Det er et vildt gæt, men prøv at flytte kodelinjen som fejler ned i OnLoad.

protected override void OnLoad(EventArgs e)
{
    this.LBtekst.DisplayMember = "txtname";
}
Avatar billede aaberg Nybegynder
23. juli 2008 - 21:08 #12
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.
Avatar billede trekkies Juniormester
23. juli 2008 - 22:38 #13
Nu kommer der ikke nogle fejl, det var bare mig som havde glemt at oprette nogle ting.

Men nu kommer der en fejl når at jeg indstaster et bogstav i tekstboksen.
Avatar billede everclear Praktikant
23. juli 2008 - 23:31 #14
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."

Den del jeg kommenterede på:-)
Avatar billede aaberg Nybegynder
24. juli 2008 - 07:58 #15
everclear: du har selvfølgelig ret. Jeg havde helt overset den kommentar. :-)

trekkies: Hvad er fejlmeddelelsen?
Avatar billede trekkies Juniormester
24. juli 2008 - 22:03 #16
Fejlen kommer når at jeg indtaster noget i tekst boksen, så kommer denne fejl:
http://www.darkskies.dk/fejl1.jpg
Avatar billede everclear Praktikant
25. juli 2008 - 08:06 #17
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?
Avatar billede aaberg Nybegynder
25. juli 2008 - 08:39 #18
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:

try
{
  adapter.Fill(dt);
}
catch(Exception ex)
{
  MessageBox.Show(ex.Message);
}

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)
Avatar billede aaberg Nybegynder
25. juli 2008 - 08:46 #19
Og som everclear foreslår, så er det altid en god ide at sætte nogle breakpoints og debugge sig igennem koden. På den måde kan man finde mange fejl.
Avatar billede trekkies Juniormester
25. juli 2008 - 13:47 #20
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.
Avatar billede aaberg Nybegynder
25. juli 2008 - 14:05 #21
I følgende linje,

this.listBox1.DisplayMember = "name";

Skal du skifte "name" ud med navnet på din kolonne i databasen.
Avatar billede trekkies Juniormester
25. juli 2008 - 14:39 #22
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.
Avatar billede aaberg Nybegynder
25. juli 2008 - 14:59 #23
prøv at skifte følgende linje:

searchParam.Value = "%" + this.textBox1.Text + "%";

ud med:

searchParam.Value = string.IsNullOrEmpty(this.textBox1.text) ? string.Empty : "%" + this.textBox1.Text + "%";
Avatar billede trekkies Juniormester
25. juli 2008 - 15:04 #24
Visual Studio siger at string ikke indeholder IsNullOrEmpty.
Avatar billede aaberg Nybegynder
25. juli 2008 - 15:11 #25
Jeg glemte at det er en .net 2.0 sag.

prøv:

searchParam.Value = this.textBox1.text == "" ? string.Empty : "%" + this.textBox1.Text + "%";
Avatar billede trekkies Juniormester
25. juli 2008 - 15:17 #26
Sådan, mange tak for hjælpen.

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?
Avatar billede aaberg Nybegynder
25. juli 2008 - 15:27 #27
Jeg vil anbefale dig at læse lidt om ADO.NET og SQL. Der findes masser af tutorials på nettet. F.eks.
http://www.codeproject.com/KB/database/DatabaseAcessWithAdoNet1.aspx

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).
Avatar billede trekkies Juniormester
25. juli 2008 - 15:32 #28
Mange tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester