Kit de Instalare in Visual Studio


Kitul de instalare pentru diferite aplicatii, mici sau mari de tip desktop se poate face prin 4 moduri in Visual Studio 2008 (probabil sunt mai multe, eu de atatea stiu deocamdata).

1. Deploy la proiect si se copie fisierul de deploy din %Project_path%”\bin\Debug\%project_name.exe%. Poti apela la aceasta varianta cand ai un proiect mic care nu implica baze de date sau alte fisiere la care trebuie facut deploy o data cu aplicatia.

2. Publish din Visual Studio. Meniul Build, optiunea Publish.

3. Crearea kit-ului cu un tool extern gen IStool. Mi se pare ultima solutie la care eu as apela, dar totusi exista si trebuie sa stim de ea. Daca va intereseaza acest tool puteti incepe documentarea de aici.

4. Kit de instalare cu un project de tip „Setup and Deployment”. Aceasta optiune o folosesc eu si cred, ca este cea mai buna, complexa si usor de realizat dupa ce ai creat corespunzator projectul. In acest project poti sa adaugi fisiere , sa adaugi anumite dll-uri, baza de date daca este una portabila gen Office Access (poti chiar si un Sql Server sau Oracle dar e mai mult de munca) creare foldere, uninstaller, deploy la alte aplicatii prerechizite gen Crystal Reports, daca ai si rapoarte prin aplicatie.

Chiar daca exemplu este pe Visual Studio 2008 presupun ca exista si in 2010, probabil mult imbunatatit.

Kit de Instalare pas cu pas

1. In aceeasi solutie (proiectul Principal) cu aplicatia se adauga un nou proiect.

2. Se selecteaza Setup Project

3. Se adauga fisierul de output pentru proiectul pentru care vrem sa realizam kit-ul.

4. Dupa ce s-a realizat conexiunea intre proiecte, in Application Folder s-au tras din proiect toate fisierele necesare pentru kit-ul dorit.

5. De acum se manipuleaza proiectul cum va fi deployat. Se adauga shortcut-uri in diferite locatii de unde se doreste sa se deschisa aplicatia, foldere, fisiere dependente, etc.

6. Interfata de instalare

In pagina deschisa se modifica pasii, si paginile din procedura de instalare.

7. Dupa ce s-a finalizat configurarea fara erori se face build la Project. Click dreapta pe project. Asta e tot ce se face si cand se modifica ceva in proiect la nivel de cod, pur si simplu se face Build si kit-ul e gata de distributie.

 8. Executabilul se gaseste in %Kit_project_name%\Debug\

Obs.: Fisierul executabil se copie impreuna cu fisierul .msi sau se copie doar fisierul .msi pentru a fi distribuit.

Export Dinamic in Excel dintr-un formular .Net


    Ce inseamna asta?

    Un formular care prin anumiti parametri (un Combo conectat la o baza de date si un Buton) poate scrie un rand in Excel. De fiecare data cand se apasa Buton-ul, se adauga o alta linie in functie de valoarea selectata in Combo. 

    Fisierul se salveaza pe zile, daca s-a depasit ziua curenta se creaza un alt document si o ia de la inceput.

   Pentru a nu incarca aplicatia cu mult cod pentru formatarea fisierului Excel, am recurs la varianta de a crea un Template si il apelez din cod. Template-ul se creaza realizand fisierul Excel in formatul dorit si salvat template (.xlt)

Demo

 
  
Code Snippet

Codul este cat de cat comentat, sper sa intelegeti.

  1. Try
  2.             Dim connexiune As New OleDb.OleDbConnection
  3.             ‘conexiunea cu baza de date
  4.             connexiune.ConnectionString = „Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\Certificate Distrugere\Certificare distrugere.mdb”
  5.             ‘se declara o comanda
  6.             Dim comand As New OleDb.OleDbCommand()
  7.             Dim reader As OleDb.OleDbDataReader
  8.  
  9.             connexiune.Open()
  10.             comand.CommandText = „SELECT CD_clienti_auto.*, CD_voucher_radiere.*” & _
  11.             „FROM CD_clienti_auto INNER JOIN CD_voucher_radiere ON CD_clienti_auto.NrCrt = CD_voucher_radiere.NrCrt ” & _
  12.             „WHERE CD_clienti_auto.NrCrt =” & cmbnume.SelectedValue & „;”
  13.  
  14.             comand.Connection = connexiune
  15.  
  16.             Dim excel_app As Excel.Application
  17.             ‘Dim wkbook As Excel.Workbook
  18.             ‘ Dim wksheet As Excel.Worksheet
  19.  
  20.  
  21.             ‘se declara linia in excel
  22.             Dim row As Integer
  23.  
  24.  
  25.  
  26.             ‘”D:\Certificate Distrugere\lista.xlt „)
  27.  
  28.             excel_app = CreateObject(„Excel.Application”)
  29.             excel_app.Visible = False
  30.  
  31.             ‘declararea path =ului catre fisierul template din pc
  32.             Dim strfile As String
  33.             strfile = „D:\Certificate Distrugere\Certificate Distrugere\” & Format(Now, „short date”).ToString & „.xls”
  34.  
  35.             ‘Incepe citirea din baza de date
  36.             reader = comand.ExecuteReader
  37.  
  38.             If reader.Read = True Then
  39.  
  40.                 ‘fisierul se salveaza pe zile. Daca trece ziua, se creaza alt fisier
  41.                 ‘verifica faca exista fisierul salvat, se adauga o linie noua
  42.  
  43.                 If File.Exists(strfile) Then
  44.                     ‘se deschide fisierul
  45.                     excel_app.Workbooks.Add(strfile)
  46.                     ‘se face insert in excel
  47.                     ‘MessageBox.Show(reader.Item(„CD_clienti_auto.Numeprenume”) & ”  sau ” & reader.Item(„numeprenume”))
  48.                     With excel_app
  49.                         row = .Range(„A65536”).End(Excel.XlDirection.xlUp).Row
  50.  
  51.                         row = row + 1
  52.                         .Range(„A” & Format$(row)).Select()
  53.                         .ActiveCell.FormulaR1C1 = reader.Item(„CD_clienti_auto.NrCrt”)
  54.                         .Range(„B” & Format$(row)).Select()
  55.                         .ActiveCell.FormulaR1C1 = reader.Item(„Numeprenume”)
  56.                         .Range(„C” & Format$(row)).Select()
  57.                         .ActiveCell.FormulaR1C1 = reader.Item(„cnp”)
  58.                         .Range(„D” & Format$(row)).Select()
  59.                         .ActiveCell.FormulaR1C1 = reader.Item(„telfixmob”)
  60.                         .Range(„E” & Format$(row)).Select()
  61.                         .ActiveCell.FormulaR1C1 = reader.Item(„email”)
  62.                         .Range(„F” & Format$(row)).Select()
  63.                         .ActiveCell.FormulaR1C1 = reader.Item(„categorie”)
  64.                         .Range(„G” & Format$(row)).Select()
  65.                         .ActiveCell.FormulaR1C1 = reader.Item(„marca”)
  66.                         .Range(„H” & Format$(row)).Select()
  67.                         .ActiveCell.FormulaR1C1 = reader.Item(„tip”)
  68.                         .Range(„I” & Format$(row)).Select()
  69.                         .ActiveCell.FormulaR1C1 = reader.Item(„an_fabricatie”)
  70.                         .Range(„J” & Format$(row)).Select()
  71.                         .ActiveCell.FormulaR1C1 = reader.Item(„an_prima_inmatriculare”)
  72.                         .Range(„K” & Format$(row)).Select()
  73.                         .ActiveCell.FormulaR1C1 = reader.Item(„ult_nr_inmatriculare”)
  74.                         .Range(„L” & Format$(row)).Select()
  75.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_identificare”)
  76.                         .Range(„M” & Format$(row)).Select()
  77.                         .ActiveCell.FormulaR1C1 = reader.Item(„serie_motor”)
  78.                         .Range(„N” & Format$(row)).Select()
  79.                         .ActiveCell.FormulaR1C1 = reader.Item(„capacitate_cilindrica”)
  80.                         .Range(„O” & Format$(row)).Select()
  81.                         .ActiveCell.FormulaR1C1 = reader.Item(„greutate”)
  82.                         .Range(„P” & Format$(row)).Select()
  83.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_seria_cert_inmatriculare”)
  84.                         .Range(„Q” & Format$(row)).Select()
  85.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_seria”)
  86.                         .Range(„R” & Format$(row)).Select()
  87.                         .ActiveCell.FormulaR1C1 = reader.Item(„CD_clienti_auto.nrcrt”)
  88.                         .Range(„S” & Format$(row)).Select()
  89.                         .ActiveCell.FormulaR1C1 = reader.Item(„dataprocesverb”)
  90.                         .Range(„T” & Format$(row)).Select()
  91.                         .ActiveCell.FormulaR1C1 = reader.Item(„nremitentatfisc”)
  92.                         .Range(„U” & Format$(row)).Select()
  93.                         .ActiveCell.FormulaR1C1 = reader.Item(„emitentatfisc”)
  94.                         .Range(„V” & Format$(row)).Select()
  95.                         .ActiveCell.FormulaR1C1 = reader.Item(„serie_ticket_valoric”)
  96.                         .Range(„W” & Format$(row)).Select()
  97.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_ticket_valoric”)
  98.                         .Range(„X” & Format$(row)).Select()
  99.                         .ActiveCell.FormulaR1C1 = „Onu Vasile”
  100.                         .Range(„Y” & Format$(row)).Select()
  101.                         .ActiveCell.FormulaR1C1 = Format(Now, „short date”).ToString
  102.  
  103.  
  104.                         ”se opresc alertele, se salveaza
  105.                         .Application.DisplayAlerts = False
  106.                         .ActiveWorkbook.SaveAs(strfile)
  107.  
  108.                     End With
  109.                     ‘MsgBox(„FLAG1”)
  110.  
  111.  
  112.                     ‘daca fisierul nu exista in ziua curenta, se creaza un nou fisier si se adauga o noua linie
  113.                     ‘linia se adauga dintr-un template si se salveaza in locatia specificata
  114.                 Else
  115.                     ‘ Create a new spreadsheet.
  116.                     excel_app.Workbooks.Add(„D:\Certificate Distrugere\lista.xlt”)
  117.                     ‘MessageBox.Show(reader.Item(„Numeprenume”))
  118.  
  119.                     ‘ Insert data into Excel.
  120.                     With excel_app
  121.  
  122.                         row = .Range(„A65536”).End(Excel.XlDirection.xlUp).Row
  123.  
  124.                         ‘.Columns(„A:A”).ColumnWidth = 35
  125.  
  126.                         ‘.Columns(„B:B”).ColumnWidth = 13
  127.                         row = row + 1
  128.                         .Range(„A” & Format$(row)).Select()
  129.                         .ActiveCell.FormulaR1C1 = reader.Item(„CD_clienti_auto.NrCrt”)
  130.                         .Range(„B” & Format$(row)).Select()
  131.                         .ActiveCell.FormulaR1C1 = reader.Item(„Numeprenume”)
  132.                         .Range(„C” & Format$(row)).Select()
  133.                         .ActiveCell.FormulaR1C1 = reader.Item(„cnp”)
  134.                         .Range(„D” & Format$(row)).Select()
  135.                         .ActiveCell.FormulaR1C1 = reader.Item(„telfixmob”)
  136.                         .Range(„E” & Format$(row)).Select()
  137.                         .ActiveCell.FormulaR1C1 = reader.Item(„email”)
  138.                         .Range(„F” & Format$(row)).Select()
  139.                         .ActiveCell.FormulaR1C1 = reader.Item(„categorie”)
  140.                         .Range(„G” & Format$(row)).Select()
  141.                         .ActiveCell.FormulaR1C1 = reader.Item(„marca”)
  142.                         .Range(„H” & Format$(row)).Select()
  143.                         .ActiveCell.FormulaR1C1 = reader.Item(„tip”)
  144.                         .Range(„I” & Format$(row)).Select()
  145.                         .ActiveCell.FormulaR1C1 = reader.Item(„an_fabricatie”)
  146.                         .Range(„J” & Format$(row)).Select()
  147.                         .ActiveCell.FormulaR1C1 = reader.Item(„an_prima_inmatriculare”)
  148.                         .Range(„K” & Format$(row)).Select()
  149.                         .ActiveCell.FormulaR1C1 = reader.Item(„ult_nr_inmatriculare”)
  150.                         .Range(„L” & Format$(row)).Select()
  151.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_identificare”)
  152.                         .Range(„M” & Format$(row)).Select()
  153.                         .ActiveCell.FormulaR1C1 = reader.Item(„serie_motor”)
  154.                         .Range(„N” & Format$(row)).Select()
  155.                         .ActiveCell.FormulaR1C1 = reader.Item(„capacitate_cilindrica”)
  156.                         .Range(„O” & Format$(row)).Select()
  157.                         .ActiveCell.FormulaR1C1 = reader.Item(„greutate”)
  158.                         .Range(„P” & Format$(row)).Select()
  159.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_seria_cert_inmatriculare”)
  160.                         .Range(„Q” & Format$(row)).Select()
  161.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_seria”)
  162.                         .Range(„R” & Format$(row)).Select()
  163.                         .ActiveCell.FormulaR1C1 = reader.Item(„CD_clienti_auto.nrcrt”)
  164.                         .Range(„S” & Format$(row)).Select()
  165.                         .ActiveCell.FormulaR1C1 = reader.Item(„dataprocesverb”)
  166.                         .Range(„T” & Format$(row)).Select()
  167.                         .ActiveCell.FormulaR1C1 = reader.Item(„nremitentatfisc”)
  168.                         .Range(„U” & Format$(row)).Select()
  169.                         .ActiveCell.FormulaR1C1 = reader.Item(„emitentatfisc”)
  170.                         .Range(„V” & Format$(row)).Select()
  171.                         .ActiveCell.FormulaR1C1 = reader.Item(„serie_ticket_valoric”)
  172.                         .Range(„W” & Format$(row)).Select()
  173.                         .ActiveCell.FormulaR1C1 = reader.Item(„nr_ticket_valoric”)
  174.                         .Range(„X” & Format$(row)).Select()
  175.                         .ActiveCell.FormulaR1C1 = „Onu Vasile”
  176.                         .Range(„Y” & Format$(row)).Select()
  177.                         .ActiveCell.FormulaR1C1 = Format(Now, „short date”).ToString
  178.  
  179.                         ‘MsgBox(„FLAG2”)
  180.                         ‘ Save the results.
  181.  
  182.                         ‘se salveaza in path general
  183.                         .ActiveWorkbook.SaveAs(strfile)
  184.                     End With
  185.  
  186.  
  187.                 End If
  188.  
  189.                 ‘ Close the workbook
  190.                 excel_app.ActiveWorkbook.Close()
  191.  
  192.                 ‘ Close Excel.
  193.                 excel_app.Quit()
  194.                 ‘ excel_app = Nothing
  195.  
  196.  
  197.  
  198.             End If
  199.  
  200.             reader.Close()
  201.  
  202.  
  203.             connexiune.Close()
  204.             MessageBox.Show(„S-a realizat cu succes exportul!”, „Success”, MessageBoxButtons.OK, MessageBoxIcon.Information)
  205.  
  206.             ‘MsgBox(„Ok”)
  207.  
  208.         Catch except As Exception
  209.  
  210.             MessageBox.Show(„Probleme la export in Excel. Este ceva important, contacteaza de urgenta Administratorul ” & except.Message, „Eroare”, MessageBoxButtons.OK, MessageBoxIcon.Error)
  211.  
  212.  
  213.         End Try

 

PS: Codul mai poate fi optimizat, dar cand l-am creat eram focusat pe rezultate, nu pe performanta.

Problema rezolvata: refresh datagrid in VB, la insert in real time


Nu cred ca titlul este prea explicit.

Problema era in felul urmator.
Am sincronizat datagrid-ul si textbox-urile cu un Dataset, era exact ce imi trebuia.

Butonul Adauga = curata databind-ul si elibereaza textbox-urile

Butonul Salveaza = face un insert parametrizat in baza de date, dar nu cu ajutorul dataset-ului ci direct printr-o conexiune deschisa cu baza de date.

Problema a aparut la sincronizarea DataGrid-ului. Acesta nu voia sa faca refresh (fill) cu noile inregistrari pana nu inchideam si deschideam aplicatia. Naspa.

Am cautat solutii:

pe net:  google nu prea m-a ajutat de data asta, sunt dejamagit. Am gasit si cateva articole pe forum-uri care explica exact problema, care era identica cu a mea, fara un rapsuns clar. Unul dintre ele este:

http://www.vbforums.com/showthread.php?t=635307

pe la colegi: nu am facut pe nimeni sa inteleaga exact cauza problemei, am primit niste sfaturi pe care le-am urmat, dar fara nici un rezultat.

Formularul:

 Sa repet, dupa insert, valorile inserate nu apareau in datagrid pana nu inchideam si deschideam aplicatia.

Chiar am facut un compromis sa fac insert-ul cu ajutorul datase-ului, dar greseala era deja facuta, si nu a mers.

Solutia: Solutia nu am gasit-o nicaieri, dupa 4 ore de gandit am gasit-o singur.

Problema a intervenit la datasource-ul dataset-ului. Nu inteleg de ce, cand am dat in wizard sa creez sursa mi-a facut string-ul de conectare ceva de genul:

connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="|Data Directory|\Certificare distrugere.mdb""

 Am inlocuit |Data Directory| cu calea catre baza de date.

connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\OMT Certificate Distrugere VSU\OMT Certificate Distrugere VSU\Certificare distrugere.mdb""

Aceast connectionstring care trebuie modificat il gasiti in fisierul app.config.

Acum toate bune si frumoase, pot trece linistit la customizare, aspect comercial si alte facilitati care le va oferi aplicatia.

PS: Foarte mare atentie cand se impacheteaza aplicatia, trebuie sa se schimbe path-ul catre locatia unde va fi baza de date dupa deploy (instalare). Ala era si rolul Data Directory…

PS2: Acest articol pentru cei care sunt prima oara pe aici face parte din dezvoltarea unei aplicatii pentru un centru Remat, pentru programul Rabla 2011.

 PS3: Daca cineva intampina problema aceasta si totusi nu pricepe din ce am scris cum se rezolva problema, ajut cu cea mai mare placere, sa nu mai piarda nimeni 4 ore.

Model Proiect Depozite de Date


Functionalitati OLAP, cateva selecturi MDX, DMX. Este proiectul meu prezentat la disciplina Depozite de Date

Aplicatie Remat (casare masini uzate)


Anul acesta 2010, in luna aprilie am fost provocat sa fac o aplicatie pentru un centru Remat. Idea era simpla, sa automatizez procesul de intocmire acte pentru casarea masinilor uzate. Cateva formulare care trebuiau sa comunice cu o baza de date, sa poata genera cateva rapoarte.

Zis si facut.

Cerintele Utilizatorului:

Formular: Word

Sistem de operare : XP

Rapoarte: Excel

Produse:

Visual Studio 2008: Visual Basic limbaj de programare

Office: Access (baza de date), Excel (Rapoarte), Word (Formulare), Macro (VB6)

Am ales Baza de date in Access doar pentru portabilitate si pentru ca deocamdata este destul

UPDATE: Beneficiarii trebuie sa aiba o licenta de Office

Legaturi:

https://ionutsblog.wordpress.com/2010/07/22/word-salvare-automata/

https://ionutsblog.wordpress.com/2010/07/26/import-date-in-access-from-word-template/

https://ionutsblog.wordpress.com/2010/08/15/cautare-documente-in-vb/

 Acestea sunt posturi mai vechi cu frame-uri din aplicatie.

Dezvoltare:

V1: Versiunea 1 a fost realizata intr-un weekend deoarece luni trebuia sa fie in productie.

In prima faza am realizat Template-urile Word, si un pic de macro in el pentru:

  1.  Completare automata campuri duble (Formularul tipizat care avea campuri duble: data, nume, serie masina).
  2.  Salvare automata intr-un folder prestabilit cu un nume unic (numarul certificatului)

V2: Aceasta a fost realizata putin mai tarziu, cand a fost necesar primul raport. Am fost sunat dimineata ca dupa amiaza trebuie raportul:) Tipic IMM

  1. Realizarea Bazei de Date (nu am avut timp sa o normalizez)
  2. Import din documentele Word salvate anterior. Se face manual, va spun mai tarziu de ce 🙂 
  3. Intocmirea raportului prin import din baza de date.

Pana aici totul a fost bine o perioada pana au aparut mai multe documente, mai multe rapoarte si trebuiau integrate

V3: Asta este ultima versiune, pe care se lucreaza si acum.

  1. Interfata in Visual Studio
  2. Un modul de cautare Documente dupa numarul certificatului. Utilitatea a aparut dupa ce l-am creat, volumul de date a crescut, a aparut nevoia cautarii documentelor.
  3. Help
  4. Kit de Instalare.

V4: Aceasta va fi versiunea complet automatizata si nu va mai fi nevoie de mine sa fac rapoartele.

  1. Trebuie sa imbunatatesc Baza de Date, normalizata, reproiectata, dar datele curente trebuie sa ramana
  2. Mai trebuie un modul de cautare Documente dupa numele Proprietarului. Aici este ceva mai complicat. Trebuie facut un select in baza de date care sa returneze numarul certificatului pe baza numelui introdus. Si apoi cu parametrul numarul certificatului trebuie apelat modulul de cautare documente. As prefera modul C#
  3. Prelucrarea documentelor Word, cu interfata, pentru un utilizator rookie. (nu stiu „inca” cum sa fac)
  4. In interfata la rapoarte,  acestea sunt doar deschise cele create de mine 🙂 Ai trebuie facut un rec macro si introdus in spatele form-ului.
  5. Posibilitatea sa fac update la aplicatie fara sa reinstalez (nici asta nu stiu „inca”). 

Acest post imi este destinat mai mult mie, sa integrez toate informatiile despre aceasta aplicatie si ce  sa ii mai fac sa fie Versiune Finala. Interventii minore in aplicatie au mai fost, dar nu merita consemnate.

Daca cineva vrea sa se implice in imbunatatire, sa imi dea sfaturi, idei aici sunt.

Aplicatia este personalizata, de asta nu pot face kit-ul public. Ar fi o idee de practica…..

ComboBox filter in .net


Cum ziceam cand mi-am deschis blog-ul, ca voi scrie lucruri nu foarte complicate, dar care iti scapa din cand in cand.

Cum sa faci filtrare intre 2 combobox-uri. Cred ca asta este denumirea: filtrare.

Adica dintr-o baza de date se incarca date cu ajutorul unui dataset.

In primul Combo se vrea o valoare sau nume, iar in al doilea se doresc doar informatiile care rezulta din acea selectare. Un select in select.

Se poate face hard din cod sau mai simplu cu ajutorul databindings. Binenteles am facut un filmulet ca este mult mai expresiv:

Nota: Inainte de a incarca data set-ul asigurativa ca baza de date este creata corespunzator. Legauri intre tabele, chei primare, chei straine, etc

Se poate face si pentru un combo, o lista, un datagrid, textbox.

Aplicatie cautare documente cu Visual Studio 2008


Cum să faci o aplicaţie care să caute documente în calculator şi să le şi deschidă când dai enter sau „cauta”. În filmuletele ce vor urma, voi arata cum functionează şi cum se face. 

1. Cum functionează (http://www.youtube.com/watch?v=ldu5y4Vp4lc

2. Cum se face (proiect nou)

Partea 1 : http://www.youtube.com/watch?v=5G0nZ68QjNs

Partea 2: http://www.youtube.com/watch?v=Ext3HIC6nGw

Update: Mda, tocmai am vazut ca nu se vede prea stralucit pe youtube, degeaba le-am incarcat. Daca e cineva interesat si nu se descurca doar cu codul si ce se intelege in filmulete, un mesaj si trimit filmuletele originale

Poate fi util la o aplicatie mai mare, care realizeaza salvari, log-uri, etc.

3. Codul, pentru cei fideli copy paste (sa nu se chinuie sa copie codul din filmulet)

 –––––––––––––––––––––––––––––-   

Public Class Form1   

    Dim numefisier As String
    ‘sub de cautare
    Private Sub cautadocument()
   

        Dim found As Integer = 0
        ‘introducem try catch pentru eventualele erori care pot aparea, nu exista document, etc
   

        Try
            If Not txtcauta.Text = Nothing Then
                ‘se curata lista
                Lwcauta.Items.Clear()
                ‘din start nu gaseste nici un document
                found = 0
                ‘pentru fiecare fisier din folderul dorit este gasit un document se afiseaza in
                ‘lista si sea aduna in found
                For Each file In My.Computer.FileSystem.GetFiles(„D:\certificate distrugere\certificate distrugere\”, FileIO.SearchOption.SearchTopLevelOnly, Nothing)
                    numefisier = My.Computer.FileSystem.GetFileInfo(file).Name
                    ‘daca titlul in search box contine ceva atunci se adauga in lista
                    If numefisier.Contains(txtcauta.Text) Then
                        Lwcauta.Items.Add(numefisier)
                        ‘se adauga la cele gasite cate 1
                        found = found + 1
   

                    End If
                Next
                ‘se notifica cate certificate au fost gasite in lblcegasesc
                Lblcegasesc.Text = found.ToString + „documente gasite”
            End If
        Catch ex As Exception
            MessageBox.Show(„nu exista calea…….”, „contactati administratorul”, MessageBoxButtons.OK, MessageBoxIcon.Error)
   

        End Try
    End Sub
   

    Private Sub btncauta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncauta.Click
        cautadocument()
   

    End Sub
    ‘se porneste documentul selectat (sa vad daca mai tin minte)
   
    Private Sub Lwcauta_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Lwcauta.DoubleClick
        Process.Start(„D:\certificate distrugere\certificate distrugere\” & numefisier.ToString)
   

    End Sub
    ‘se identifica documentul
   

    Private Sub Lwcauta_ItemSelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.ListViewItemSelectionChangedEventArgs) Handles Lwcauta.ItemSelectionChanged
        numefisier = e.Item.Text
   

    End Sub
    ‘daca vrem dupa ce scriem textul in textbox sa dam enter fara a mai apasa butonul cauta
   

    Private Sub txtcauta_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtcauta.KeyUp
        If e.KeyCode = Keys.Enter Then
            cautadocument()
   

        End If
    End Sub
    ‘sa vedem daca merge
End Class