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.