Avatar billede sidenius Nybegynder
14. juli 2008 - 09:31 Der er 33 kommentarer og
1 løsning

Data skal hentes efter tryk på "Søg" knap

hej , for at sige det med det samme har jeg ikke så meget styr på C# eller programmeringen, men jeg har i Visual Studio 2008 express lavet en windows form hvor man bl.a kan skrive en "Titel" ind i et felt og så herefter trykke på en "Søg"knap ved siden af hvor den så skulle ( hvis det er rigtig det jeg har lavet ) vise resultatet i en listbox , jeg har lavet plads til nedenunder.

Data'ene skal jeg vel først have defineret et eller andet sted ?

Håber nogen har tid til at hjælpe
Avatar billede aaberg Nybegynder
14. juli 2008 - 09:50 #1
Du skal have et datalager af en eller anden slags. De mest almindelige måder at gemme data på, er at have en relationel database, en xml fil eller en tekstfil. Men data kan også komme fra en excel fil, et openoffice calc dokument, eller hvilket som helst anden datakilde.
Avatar billede aaberg Nybegynder
14. juli 2008 - 09:52 #2
Hvis du er helt ny i programmering, og du ikke har arbejdet med relationelle databaser før, kan du jo starte med en xml-fil. Relationelle databaser er dog det som give bedst performance, og er i de fleste tilfælde det som bliver brugt i større projekter.
Avatar billede sidenius Nybegynder
14. juli 2008 - 09:59 #3
Jeg har data'ene placeret i en Excel 2007 fil ( tror den hedder .xlsx ). Håber jeg kan trække dem derfra
Avatar billede aaberg Nybegynder
14. juli 2008 - 10:55 #4
Her kommer et kodeeksempel. I eksemplet har jeg en Excel 2007 fil, som hedder "c:\temp\test.xlsx". I denne excelfil har jeg et ark som hedder "Ark1", hvori der er en kolonne som hedder "value", hvor jeg har lagt nogle værdier.

OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\temp\\test.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES\"");
OleDbCommand command = connection.CreateCommand();

command.CommandText = "select * from [Ark1$]";
OleDbDataAdapter adapt = new OleDbDataAdapter(command);

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

this.listBox1.DisplayMember = "value";
this.listBox1.DataSource = dt;
Avatar billede sidenius Nybegynder
14. juli 2008 - 10:58 #5
i min Excel fil , har jeg f.eks en kolonne med titel . Hvordan får jeg Søg-knappen til at hente en titel fra denne kolonne ? ... hvis man kan altså
Avatar billede aaberg Nybegynder
14. juli 2008 - 11:33 #6
Her er noget eksempelkode som søger efter teksten fra din titel tekstboks (i eksemplet er navnet på teksboksen "textBox1"), og viser resultatet i en listbox (listBox1)

private void button1_Click(object sender, EventArgs e)
        {
            OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\\temp\\test.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES\"");
            OleDbCommand command = connection.CreateCommand();

            command.CommandText = "select * from [Ark1$] where titel like @seachString";
            command.Parameters.Add(new OleDbParameter("@seachString", "%" + this.textBox1.Text + "%"));
            OleDbDataAdapter adapt = new OleDbDataAdapter(command);

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

            this.listBox1.DisplayMember = "titel";
            this.listBox1.DataSource = dt;
        }
Avatar billede ebea Ekspert
14. juli 2008 - 11:41 #7
Jeg har lavet lidt det samme med brug af TextBox. Der søger du i TextBox1 og derefter får du resultatet retur i TextBox2.

Private Sub CommandButton1_Click()
      Findwho = TextBox1.Text     
    Worksheets(" ").Activate 'imellem de 2 apostrofer indsætter du navnet på dit ark
    Range("A1").Select
    Cells.FindNext(After:=ActiveCell).Activate
    Cells.Find(What:=Findwho, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
    :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
    False).Activate
    TextBox2.Value = ActiveCell.Offset(0, 0).Value
Avatar billede sidenius Nybegynder
14. juli 2008 - 12:14 #8
min kode ser foreløbig sådan her ud:

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 Filmliste
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
           

        }

        private void button1_Click(object sender, EventArgs e)
        {
            OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\\Filmliste.xlsx;Extended Properties =\"Excel 12.0 Xml;HDR=YES\"");
            OleDbCommand command = connection.CreateCommand();

            command.CommandText = "select * from [Ark1$] where titel like @seachString";
            command.Parametersl.Add(new OleDbParameter("@seachString", "%" + this.textBox1.Text + "%"));

            OleDbDataAdapter adapt = new OleDbDataAdapter(command);

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

            this.listBox1.DisplayMember = "Titel";
            this.listBox1.DataSource = dt;
       
       
        }
    }
}

men jeg kan ikke rigtig få det til at virke og får fl.g fejl:

Error    1    The type or namespace name 'OleDbConnection' could not be found (are you missing a using directive or an assembly reference?)   

Error    3    The type or namespace name 'OleDbCommand' could not be found (are you missing a using directive or an assembly reference?)   

Error    4    The type or namespace name 'OleDbParameter' could not be found (are you missing a using directive or an assembly reference?)   

Error    5    The type or namespace name 'OleDbDataAdapter' could not be found (are you missing a using directive or an assembly reference?)
Avatar billede aaberg Nybegynder
14. juli 2008 - 12:23 #9
Tilføy følgende kodelinje under "using System.Windows.Forms;":

using System.Data.OleDb;
Avatar billede aaberg Nybegynder
14. juli 2008 - 12:23 #10
Tilføy = Tilføj

:-)
Avatar billede ebea Ekspert
14. juli 2008 - 12:28 #11
hej Sidenius; er det ikke meget kode at skrive, når du kunne lave det noget enklere og mere overskueligt for dig, med den kodestump jeg foreslog.
Avatar billede sidenius Nybegynder
14. juli 2008 - 12:32 #12
Fik tilføjet linien og kørt det igennem igen, men så ved linien adapt.fill(dt); får jeg et vindue op hvor der står fl.g: "OleDbException was unhandled" ( Den installerbare ISAM kan ikke findes ). adapt.fill(dt); er markeret med gult og der er en gul pil ud for denne linie
Avatar billede sidenius Nybegynder
14. juli 2008 - 12:39 #13
hej ebea . Jo der er en del at skrive, men tænkte nu ville jeg bare prøve det første foreslag da jeg allerede havde fået skrevet lidt indtil jeg så den kode du var kommet med.
Avatar billede ebea Ekspert
14. juli 2008 - 12:45 #14
Jeg har lavet en UserForm i Excel hvor der lagres 7 forskellige info's fra input i TextBoxe, med VBA. Og som jeg næsten kan se af din kode, skal du gemme nogle filmtitler og andet, og det kan du gøre meget nemt med samme type TextBoxe, hvor du både kan lægge data til Regnearket (databasen) og hente samme data tilbage, hvis du skal finde en bestemt info.
Avatar billede aaberg Nybegynder
14. juli 2008 - 13:24 #15
Du mangler tydeligvis OleDB driveren for Excel 2007. Du kan downloade den her:
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7554f536-8c28-4598-9b72-ef94e038c891

ebea: Dit eksempel fylder 8 linjer VB kode, mit eksempel fylder 9 linjer C# kode. Hvis det er 1 linje kode som afgøre om man skal bruge en Excel-makro eller en Windows App skrevet i C#, så har man fokus helt forkert sted. Hvis man ønsker at lave en Form i Excel, kan man bruge dit eksempel. Hvis man ønsker at skrive et Windowsprogram som bruger Excel som database, kan man bruge mit eksempel.

Fordelene ved at bruge Visual Studio og C# er mange. F.eks. kan dit program virke uden at have Excel installeret. En anden fordel er, at hvis du forstår ADO.NET (frameworket som bliver brugt i mit kodeeksempel), kan du forbinde til enhver database, og vise og behandle data uden at skulle lære et nyt sprog eller framework hver gang.
Avatar billede sidenius Nybegynder
14. juli 2008 - 13:38 #16
hej aaberg , jeg har hentet ODBC driveren, genstartet programmerne, men får stadig en OleDbException was unhandled ( Den installerbare ISAM kan ikke findes ) ved adapt.Fill(dt); - linien
Avatar billede ebea Ekspert
14. juli 2008 - 13:41 #17
aaberg_cc:  Det var nu ikke selve antallet af kodelinier, jeg tænkte så meget på. Men mere at det for en nybegynder nemt kan komme til at virke uoverskueligt med DB Connections og andet, når man egentlig kan lave det hele i Excel. Han skal jo formentlig ikke lave en database til at styre voldsomt store datamængder, og så er Excel jo ganske udmærket et langt stykke hen af vejen, for di han kan lave UserForm's og andet med VBA.
Avatar billede aaberg Nybegynder
14. juli 2008 - 13:52 #18
Prøv at skifte følgende linje:
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\\Filmliste.xlsx;Extended Properties =\"Excel 12.0 Xml;HDR=YES\"");

ud med:
OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Filmliste.xlsx;Extended Properties=Excel 8.0");
Avatar billede aaberg Nybegynder
14. juli 2008 - 13:57 #19
VEEENT. Jeg har fundet fejlen, den er i din connectionstring. Der skal være mellemrum i "DataSource", så det bliver "Data Source".
Avatar billede aaberg Nybegynder
14. juli 2008 - 13:58 #20
Altså, linjen:
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;DataSource=C:\\Filmliste.xlsx;Extended Properties =\"Excel 12.0 Xml;HDR=YES\"");

bliver til:
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Filmliste.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES\"");

Brug copy/paste :-)
Avatar billede sidenius Nybegynder
14. juli 2008 - 14:04 #21
har skiftet linien ud, men den giver stadig samme error. Den bliver ved med at sætte en gul pil ud for linien adapt.Fill(dt) og så fremkommer der i et lille vindue "OleDbException was unhandled"
Avatar billede sidenius Nybegynder
14. juli 2008 - 14:04 #22
sorry, det prøver jeg lige :)
Avatar billede sidenius Nybegynder
14. juli 2008 - 14:13 #23
nej desværre...får stadigvæk samme fejl som ovenstående :(
Avatar billede aaberg Nybegynder
14. juli 2008 - 14:17 #24
Prøv at copy/paste hele din kode herind igen.
Avatar billede sidenius Nybegynder
14. juli 2008 - 14:20 #25
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;
using System.Data.OleDb;


namespace Filmliste
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
           

        }

        private void button1_Click(object sender, EventArgs e)
        {
            OleDbConnection connection = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Filmliste.xlsx;Extended Properties=\"Excel 12.0 Xml;HDR=YES\"");
            OleDbCommand command = connection.CreateCommand();

            command.CommandText = "SELECT * from [Ark1$] where titel like @searchString";
            command.Parameters.Add(new OleDbParameter("@searchString", "%" + this.textBox1.Text + "%"));

            OleDbDataAdapter adapt = new OleDbDataAdapter(command);

            DataTable dt = new DataTable();
            adapt.Fill(dt);
           
            this.listBox1.DataSource = dt;
            this.listBox1.DisplayMember = "titel";
       
        }
    }
}
Avatar billede ebea Ekspert
14. juli 2008 - 14:21 #26
aaberg_cc!  Det var egentlig for at undgå ovenstående for Sidenius. Så om C# det er let ??.
Avatar billede aaberg Nybegynder
14. juli 2008 - 14:36 #27
Er fejlen stadig "Den installerbare ISAM kan ikke findes"?

ebea: Hvis du kun skal lave en simpel filmliste, så giver jeg dig ret i at det kan være ok at lave den som en Excel-makro. Hvis du derimod laver en filmliste for at lære at programmere, eller fordi man i fremtiden har flere planer med programmet, så er en Windows app nok et bedre valg. Det kan jo være at der er en grund til at dette spørgsmål findes under C# kategorien, og ikke Excel kategorien.
Avatar billede sidenius Nybegynder
14. juli 2008 - 14:48 #28
den kommer godtnok stadig op med en "OleDbException was unhandled" men nu med beskeden :"Der er ikke angivet nogen værdier for en eller flere krævede parametre". adapt.fill(dt); er stadigvæk markeret med gult
Avatar billede sidenius Nybegynder
14. juli 2008 - 14:57 #29
Den skriver også fl.g:

Error    1    'System.Data.OleDb.OleDbCommand' does not contain a definition for 'ParametersAdd' and no extension method 'ParametersAdd' accepting a first argument of type 'System.Data.OleDb.OleDbCommand' could be found (are you missing a using directive or an assembly reference?)
Avatar billede aaberg Nybegynder
14. juli 2008 - 14:58 #30
Det betyder at den ikke finder en kolonne med navnet "titel" i "Ark1" arket.

Sørg for at navnet på kolonnen i excel er stavet helt ens med navnet i command.CommandText propertien. Derudover er det vigtigt at kolonnen i Excel er på række 1 (Altså den øverste kolonne). Du kan godt have flere kolonner, men den første kolonne skal være på kolonne A i Excel (Altså den første kolonne). Arket skal også staves på samme måde i Excel og i kommandoen i C# koden.
Avatar billede aaberg Nybegynder
14. juli 2008 - 15:01 #31
Den sidste fejlmeddelelse du skriver: Har du kommet til at fjerne punktumet mellem Parameters og Add? Det skal være command.Parameters.Add(....);
Avatar billede sidenius Nybegynder
14. juli 2008 - 15:22 #32
Så lykkedes det aaberg ! . Fik sat punktum mellem Parameters og Add . Og så fik jeg rettet mit Excel dokument til så jeg har Titelerne i først kolonne og det kører rigtig godt. Nu fortjener du vist også at få de points ! Selvom de burde ha været meget mere :) .
Avatar billede aaberg Nybegynder
14. juli 2008 - 15:25 #33
He he, det giver altid en god følelse i maven når man får det til at virke :-D

Skulle det være en anden gang... :-)
Avatar billede sidenius Nybegynder
14. juli 2008 - 15:31 #34
ja det er super når man ser det virke :)...nu kan jeg så prøve at rode med et par flere funktioner inden jeg måske kommer herind igen ;) ( Det ku jo godt være hehe ;) ) ... men tusind Tak :)
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