Piccolo Progetto

di il
5 risposte

Piccolo Progetto

Buonasera
Dovrei sviluppare un piccolo applicativo in c#, non avendo molta famigliarità con il mondo .net , avrei bisogno di alcune Indicazioni su come impostare il progetto ed i passaggi
Questo è quello che bisogna creare.
1) creare un db con mysql contenente alcune tabelle
2) creare una finestra C# che contenga Internet Control e mostri una pagina html
3) All'interno di questa pagina html, tramite dei widget in js mostrare i dati che arrivano dal db , tra cui dei link per visualizzare un messaggio
es.
dato1 | dato2 | link1 link2
4) In ultimo il messaggio(dei link) deve essere un evento intercettato da contenitore (non deve visualizzarlo js)

Spiego come desideravo impostare il progetto.
Punto 2: Potrei utilizzare WebBrowser control di c#? è la soluzione corretta?
Punto 3 Creo un server web con Razor page? oppure Server web con js?
Punto 4 Qui diciamo che mi sono perso

Spero di essere stato abbastanza chiaro
Grazie
Marco

5 Risposte

  • Re: Piccolo Progetto

    Ciao,
    beh quello che chiedi non è proprio adatto a chi non ha famigliarità con il mondo NET se lo vuoi fare in NET...
    Comunque posso darti qualche suggerimento:
    1) potresti creare un context con Entity Framework, lo trovo molto rapido da implementare
    2) potresti utilizzare webview2 in un qualsiasi progetto windows form
    3) dipende da cosa intendi e cosa sai fare. Potresti creare delle chiamate fetch intervallate e caricare i dati da una webapi ed inserire i link nella pagina
    4) i link sopra li fai puntare al contenitore tramite window.chrome.webview.postMessage sulla pagina con js e li ricevi tramite l'evento della webview "WebMessageReceived"

    Nella pratica:
    crea un nuovo progetto asp.net con NET 5 (o 6); aggiungi i pacchetti nuget: "MySql.Data" e "MySqlEntityFrameworkCore"; aggiungi un nuovo file cs e chimalo Context.cs; dentro il file Context.cs crea il contesto dati Entity Framework:
    
    public class Context : DbContext
        {
            public DbSet<Data> TableTest { get; set; }
    
            public Context(DbContextOptions<Context> options) : base(options) { }
        }
    
        public class Data
        {
            public int? ID { get; set; }
            public string? Value { get; set; }
        }
    
    in questo caso si tratta di una sola tabella con campi ID e Value, ovviamente potrai aggiungere le varie tabelle che vuoi con nomi e tipi tuoi (questo è solo un esempio);
    In appsettings.json aggiungi la stringa di connessione:
    
    "ConnectionStrings": {
        "DefaultConnection": "server=mioserver.it; port=3306; database=mioDB; user=mioUser; password=miaPassword; ecc.."
    
    Ora dovresti avere il controller ValuesController.cs, scrivi il metodo che si interfaccia con il db:
    
    [Route("[controller]")]
        [ApiController]
        public class ValuesController : ControllerBase
        {
            private Context _Context;
            public ValuesController(Context Context)
            {
                _Context = Context;
                _Context.Database.EnsureCreated();
            }
            public string Get([FromQuery] ValueParam val)
            {
                if (val?.Value != "nd")
                {
                    _Context.TableTest.Add(new Data() { Value = val.Value });
                    _Context.SaveChanges();
                }
                return $"totale: {_Context.TableTest.Count()} Ultimo valore: {_Context.TableTest.ToList().Last().Value} Ultimo ID: {_Context.TableTest.ToList().Last().ID}";
            }
        }
        public class ValueParam
        {
            public string Value { get; set; }  
        }
    
    nella classe program.cs dovresti fare una cosa del genere:
    
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddDbContext<Context>(options => options.UseMySQL(builder.Configuration.GetConnectionString("DefaultConnection")));
    // Add services to the container.
    builder.Services.AddRazorPages();
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (!app.Environment.IsDevelopment())
    {
        app.UseExceptionHandler("/Error");
        // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
        app.UseHsts();
    }
    
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    
    app.UseRouting();
    
    app.UseAuthorization();
    
    app.MapRazorPages();
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
    
    app.Run();
    
    Poi aggiungi una pagina web al progetto e chiamala WebView.html, il suo contenuto potrebbe essere questo:
    
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <script>
            var lastText = ""; 
            async function getData() {
                let response = await fetch('https://localhost:1234/values/?value=nd');//metti il numero di porta del tuo progetto web
                let text = await response.text();
                if (lastText != text) {
                    var link = document.createElement('a');
                    link.setAttribute('href', '#');
                    link.setAttribute('onclick', 'linkClick(\'' + text + '\');');
                    link.innerHTML = text;
                    document.body.appendChild(link);
                    document.body.appendChild(document.createElement('br'));
                }
                lastText = text;
                setTimeout(getData, 5000);
            }
            function linkClick(text) {
                window.chrome.webview.postMessage(text);
            }
            getData();
        </script>
    </body>
    </html>
    
    Ora aggiungi alla soluzione un nuovo progetto windows form sempre net 5 o 6, tramite nuget aggiungi il pacchetto: "Microsoft.Web.WebView2".
    Aggiungi la WebView2 (dovresti trovarlo tra i controlli disponibili nella barra) al Form1, poi apri la parte codice (f7 dalla finestra di progettazione) ed aggiungi un codice del genere per il costruttore:
    public Form1()
            {
                InitializeComponent();
                Load +=async (sender, e) => {
                    webView21.CoreWebView2InitializationCompleted += (s, se) => {
                        webView21.CoreWebView2.Navigate("https://localhost:1234/webview.html");
                        webView21.WebMessageReceived += (s, message) =>
                        MessageBox.Show(message.TryGetWebMessageAsString());
                    };
                    await webView21.EnsureCoreWebView2Async();                
                };
            }
    Ora puoi avviare il progetto web; chiami https://localhost:1234/values/?value=test (dove 1234 è il numero di porta assegnato al progetto) dal browser, questo dovrebbe aggiungerti un nuovo record in MySql, mentre in risposta dovresti vedere il numero di record totali, l'ultimo valore e id inserito come semplice stringa (senza alcuna formattazione html, è solo una prova di concetto). Ora puoi avviare il progetto windows form sempre tenendo aperto il progetto web (fai tasto dx sul progetto winform e scegli "debug->avvia nuova istanza"), dovresti vedere il primo link che compare con il testo simile a quello dato nella pagina chiamata da progetto web, giusto il tempo di caricare, una volta comparso puoi cliccarci e potrai vedere che il testo del link verrà riportato in un messagebox appartenente al progetto "contenitore", quindi al progetto Windows form, che a questo punto è a conoscenza del testo del link cliccato dentro la pagina web del controllo.
    Sempre tenendo aperto il programma winform puoi richiamare la prima pagina con il browser (https://localhost:1234/values/?value=Altrotest), essendo diverso dal primo verrà aggiunto un nuovo record, di conseguenza vedrai aggiungersi un nuovo link anche nel progetto winform, ovviamente sarà anche quello cliccabile e potrai passarlo al contenitore con il click.

    Credo sia quello che cercavi a livello di concetto. Se c'è qualcosa che vuoi che ti spieghi meglio, prova a creare seguendo le istruzioni che ti ho dato, dopo ti posso spiegare nel dettaglio.
  • Re: Piccolo Progetto

    Ti ringrazio tantissimo!!!
    diciamo che ero totalmente fuori strada.
    ora provo a studiarlo cosi da capire un po..
    Grazie ancora
  • Re: Piccolo Progetto

    No, perché fuori strada? quello che riassumevi non è molto diverso da quello che ti ho proposto. Magari quello che ti ho proposto è un po più concreto, ma non è molto diverso...
    Non è che magari sto capendo male io?
    Cosa non ti quadra con quello che hai pensato tu?
  • Re: Piccolo Progetto

    No non stai capendo male, ora provo ad implementarlo con le modifiche del caso, mi si chiede anche di mettere un charts contenente dei valori.
    Grazie ancora
  • Re: Piccolo Progetto

    Di nulla. Nel caso abbia bisogno mi trovi "in zona"

    Buon lavoro
Devi accedere o registrarti per scrivere nel forum
5 risposte