426 lines
13 KiB
C#
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
|
|
}
|
|
}
|