Files
elma/ELMA/MainForm.cs
T
2020-09-01 09:31:56 +02:00

426 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Entity;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using AppData;
using Newtonsoft;
using Newtonsoft.Json;
namespace ELMA
{
public partial class MainForm : Form
{
#region setup
ElmahModel model = new ElmahModel();
/// <summary>
/// Oggetto conf setup
/// </summary>
protected eSetup stdSetup;
/// <summary>
/// Setup file std
/// </summary>
protected string setupFile = "setup.json";
/// <summary>
/// Setup configurazione da std file
/// </summary>
private void setupConfig()
{
eSetup stdSetup = new eSetup();
// cerco il file json di config
string basePath = Directory.GetCurrentDirectory();
//string basePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
string filePath = $"{basePath}\\CONF\\{setupFile}";
if (File.Exists(filePath))
{
try
{
stdSetup = JsonConvert.DeserializeObject<eSetup>(File.ReadAllText(filePath));
}
catch
{ }
}
if(string.IsNullOrEmpty(stdSetup.name))
{
// se non lo trovo creo setu...
stdSetup = new eSetup()
{
name = "standard",
connString = "data source=SQL2016DEV;initial catalog=Elmah;persist security info=True;user id=sa;password=keyhammer16;MultipleActiveResultSets=True;App=EntityFramework",
appBasePath = "/LM/W3SVC/1/ROOT",
baseUrl = "https://localhost:44388"
};
// .. e lo salvo...
string rawData = JsonConvert.SerializeObject(stdSetup,Formatting.Indented);
File.WriteAllText(filePath, rawData);
}
}
#endregion
#region area init & close
public MainForm()
{
InitializeComponent();
myInit();
startTimers();
}
private void startTimers()
{
timerUI.Start();
timerMain.Start();
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
timerUI.Stop();
timerMain.Stop();
}
private void myInit()
{
setupConfig();
setupFilterData();
doUpdate();
}
private void timerUI_Tick(object sender, EventArgs e)
{
progBar.Increment(1);
if (progBar.Value >= 100)
{
progBar.Value = 0;
}
}
private void timerMain_Tick(object sender, EventArgs e)
{
#if false
setupFilterData();
doUpdate();
#endif
}
#endregion
#region Utils e metodi dati
private void setupFilterData()
{
// resetto dati
listApp.Items.Clear();
listHost.Items.Clear();
listStatus.Items.Clear();
listType.Items.Clear();
listUsers.Items.Clear();
// carico DB con filtri
var setApp = model.ELMAH_Error
.Select(e => new { e.Application })
.Distinct()
.ToList();
foreach (var item in setApp)
{
listApp.Items.Add(item.Application);
}
var setHost = model.ELMAH_Error
.Select(e => new { e.Host })
.Distinct()
.ToList();
foreach (var item in setHost)
{
listHost.Items.Add(item.Host);
}
var setStatus = model.ELMAH_Error
.Select(e => new { e.StatusCode })
.Distinct()
.ToList();
foreach (var item in setStatus)
{
listStatus.Items.Add(item.StatusCode);
}
var setType = model.ELMAH_Error
.Select(e => new { e.Type })
.Distinct()
.ToList();
foreach (var item in setType)
{
listType.Items.Add(item.Type);
}
var setUser = model.ELMAH_Error
.Select(e => new { e.User })
.Distinct()
.ToList();
//var setUser = dbFilt.Where(x => x.Cat == "User").ToList();
foreach (var item in setUser)
{
listUsers.Items.Add(item.User);
}
listApp.SelectedIndex = 0;
listHost.SelectedIndex = 0;
listStatus.SelectedIndex = 0;
listType.SelectedIndex = 0;
listUsers.SelectedIndex = 0;
}
private void checkFilterVisibility()
{
// Verifico TUTTI i filtri
listApp.Enabled = chkApp.Checked && listApp.Items.Count > 0;
listHost.Enabled = chkHost.Checked && listHost.Items.Count > 0;
listStatus.Enabled = chkStatus.Checked && listStatus.Items.Count > 0;
listType.Enabled = chkType.Checked && listType.Items.Count > 0;
listUsers.Enabled = chkUsers.Checked && listUsers.Items.Count > 0;
}
protected string selApp { get { return listApp.SelectedItem.ToString(); } }
protected string selStatus
{
get
{
string answ = "";
if (chkStatus.Checked)
{
if (listStatus.SelectedItem != null)
{
answ = listStatus.SelectedItem.ToString();
}
}
return answ;
}
}
protected string selHost { get { return listHost.SelectedItem.ToString(); } }
protected string selType { get { return listType.SelectedItem.ToString(); } }
protected string selUser { get { return listUsers.SelectedItem.ToString(); } }
private void updateSelection()
{
List<ELMAH_Error> subset = getFiltData();
this.bsErrors.DataSource = subset;
for (int i = 0; i < ErrorsDGV.Columns.Count - 1; i++)
{
ErrorsDGV.Columns[i].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
tsslNumRec.Text = $"{subset.Count} rec";
}
private List<ELMAH_Error> getFiltData()
{
var dbSet = model.ELMAH_Error;
int statusCode = 0;
int.TryParse(selStatus, out statusCode);
string selApp = listApp.SelectedItem.ToString();
// inizio azione filtraggio..
IQueryable<ELMAH_Error> subset = dbSet.Where(x => x.Sequence > 0);
if (chkApp.Checked)
{
subset = subset.Where(x => x.Application == selApp);
}
if (chkHost.Checked)
{
subset = subset.Where(x => x.Host == selHost);
}
if (chkStatus.Checked)
{
subset = subset.Where(x => x.StatusCode == statusCode);
}
if (chkType.Checked)
{
subset = subset.Where(x => x.Type == selType);
}
if (chkUsers.Checked)
{
subset = subset.Where(x => x.User == selUser);
}
return subset.OrderByDescending(x => x.TimeUtc).ToList();
}
/// <summary>
/// Aggiornamento visualizzazioni
/// </summary>
private void doUpdate()
{
checkFilterVisibility();
updateSelection();
}
private void deleteRecordFiltered()
{
// elimino 1:1 da selezione
foreach (var item in getFiltData())
{
model.ELMAH_Error.Remove(item);
}
// salvo
model.SaveChangesAsync();
// aggiorno!!
setupFilterData();
doUpdate();
}
private void deleteSelRows()
{
Guid ErrorId;
// SOLO SE selezionato in dgv...
if (ErrorsDGV.SelectedRows.Count > 0)
{
foreach (DataGridViewRow riga in ErrorsDGV.SelectedRows)
{
// chiudo!
ErrorId = ((ELMAH_Error)riga.DataBoundItem).ErrorId;
try
{
model.ELMAH_Error.Remove((ELMAH_Error)riga.DataBoundItem);
}
catch
{ }
}
}
// salvo
model.SaveChanges();
// aggiorno!!
doUpdate();
}
private void resetFilter()
{
chkApp.Checked = false;
chkHost.Checked = false;
chkStatus.Checked = false;
chkType.Checked = false;
chkUsers.Checked = false;
}
#endregion
#region area interazione
private void listApp_SelectedIndexChanged(object sender, EventArgs e)
{
if (chkApp.Checked)
doUpdate();
}
private void listHost_SelectedIndexChanged(object sender, EventArgs e)
{
if (chkHost.Checked)
doUpdate();
}
private void listStatus_SelectedIndexChanged(object sender, EventArgs e)
{
if (chkStatus.Checked)
doUpdate();
}
private void listType_SelectedIndexChanged(object sender, EventArgs e)
{
if (chkType.Checked)
doUpdate();
}
private void listUsers_SelectedIndexChanged(object sender, EventArgs e)
{
if (chkUsers.Checked)
doUpdate();
}
private void chkApp_CheckedChanged(object sender, EventArgs e)
{
doUpdate();
}
private void chkType_CheckedChanged(object sender, EventArgs e)
{
doUpdate();
}
private void chkStatus_CheckedChanged(object sender, EventArgs e)
{
doUpdate();
}
private void chkHost_CheckedChanged(object sender, EventArgs e)
{
doUpdate();
}
private void chkUsers_CheckedChanged(object sender, EventArgs e)
{
doUpdate();
}
private void ErrorsDGV_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
// seleziono riga
}
/// <summary>
/// Elimino record selezionati
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnDeleteSel_Click(object sender, EventArgs e)
{
deleteSelRows();
}
/// <summary>
/// Calcola path applicazione partendo da bassePath
/// </summary>
/// <param name="application"></param>
/// <returns></returns>
protected string getAppPath(string application)
{
return application.Replace(stdSetup.appBasePath, "");
}
private void ErrorsDGV_DoubleClick(object sender, EventArgs e)
{
// recupero valore...
Guid ErrorId;
string appPath = "";
string pageUrl = "";
// SOLO SE selezionato in dgv...
if (ErrorsDGV.SelectedRows.Count > 0)
{
foreach (DataGridViewRow riga in ErrorsDGV.SelectedRows)
{
// recupero dati
ErrorId = ((ELMAH_Error)riga.DataBoundItem).ErrorId;
appPath = getAppPath(((ELMAH_Error)riga.DataBoundItem).Application);
// SE appPAth !="" accodo...
if (!string.IsNullOrEmpty(appPath))
{
pageUrl = $"{stdSetup.baseUrl}/{appPath}/elmah.axd/detail?id={ErrorId}";
}
else
{
pageUrl = $"{stdSetup.baseUrl}/elmah.axd/detail?id={ErrorId}";
}
// mostro form
var newBrowser = new WBrowser();
newBrowser.pageUrl = pageUrl;
newBrowser.Show();
}
}
}
#endregion
}
}