From 1de3cbdbfb2fb6140648b4fd81a63ef05b7f1169 Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Fri, 17 Jun 2016 16:39:22 +0300 Subject: [PATCH 1/9] Added the ability to show the additional columns added to log files by developers --- src/YALV.Core/Domain/LogItem.cs | 3 + src/YALV.Core/Providers/XmlEntriesProvider.cs | 9 +++ src/YALV/Common/FilteredGridManager.cs | 35 ++++++++-- src/YALV/MainWindow.xaml.cs | 9 ++- src/YALV/ViewModel/MainWindowVM.cs | 64 ++++++++++++++----- 5 files changed, 96 insertions(+), 24 deletions(-) diff --git a/src/YALV.Core/Domain/LogItem.cs b/src/YALV.Core/Domain/LogItem.cs index 317580c..68e84f0 100644 --- a/src/YALV.Core/Domain/LogItem.cs +++ b/src/YALV.Core/Domain/LogItem.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; namespace YALV.Core.Domain { @@ -24,6 +25,8 @@ public class LogItem public string Line { get; set; } public string Uncategorized { get; set; } + public Dictionary CustomFields { get; set; } = new Dictionary(); + /// /// LevelIndex /// diff --git a/src/YALV.Core/Providers/XmlEntriesProvider.cs b/src/YALV.Core/Providers/XmlEntriesProvider.cs index 40d8776..850ed00 100644 --- a/src/YALV.Core/Providers/XmlEntriesProvider.cs +++ b/src/YALV.Core/Providers/XmlEntriesProvider.cs @@ -71,6 +71,14 @@ public override IEnumerable GetEntries(string dataSource, FilterParams case ("log4net:HostName"): entry.HostName = xmlTextReader.GetAttribute("value"); break; + default: + var name = xmlTextReader.GetAttribute("name"); + if (!name.StartsWith("log4net:")) + { + var val = xmlTextReader.GetAttribute("value"); + entry.CustomFields.Add(name, val); + } + break; } break; case ("log4j:throwable"): @@ -97,6 +105,7 @@ public override IEnumerable GetEntries(string dataSource, FilterParams } } } + } private static bool filterByParameters(LogItem entry, FilterParams parameters) diff --git a/src/YALV/Common/FilteredGridManager.cs b/src/YALV/Common/FilteredGridManager.cs index 4403443..f573ba8 100644 --- a/src/YALV/Common/FilteredGridManager.cs +++ b/src/YALV/Common/FilteredGridManager.cs @@ -1,14 +1,21 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.Globalization; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; -using System.Windows.Input; +using System.Windows.Forms; using YALV.Common.Converters; using YALV.Core.Domain; using YALV.Properties; +using Application = System.Windows.Application; +using Binding = System.Windows.Data.Binding; +using DataGrid = System.Windows.Controls.DataGrid; +using KeyEventHandler = System.Windows.Input.KeyEventHandler; +using Panel = System.Windows.Controls.Panel; +using TextBox = System.Windows.Controls.TextBox; namespace YALV.Common { @@ -31,7 +38,7 @@ public FilteredGridManager(DataGrid dg, Panel txtSearchPanel, KeyEventHandler ke #region Public Methods - public void BuildDataGrid(IList columns) + public void BuildDataGrid(IList columns, List newColumns = null) { if (_dg == null) return; @@ -43,10 +50,12 @@ public void BuildDataGrid(IList columns) if (columns != null) { + _dg.Columns.Clear(); foreach (ColumnItem item in columns) { DataGridTextColumn col = new DataGridTextColumn(); - col.Header = item.Header; + + col.Header = item.Header; if (item.Alignment == CellAlignment.CENTER && _centerCellStyle != null) col.CellStyle = _centerCellStyle; if (item.MinWidth != null) @@ -54,8 +63,24 @@ public void BuildDataGrid(IList columns) if (item.Width != null) col.Width = item.Width.Value; - Binding bind = new Binding(item.Field) { Mode = BindingMode.OneWay }; - bind.ConverterCulture = System.Globalization.CultureInfo.GetCultureInfo(Properties.Resources.CultureName); + Binding bind; + if (newColumns != null && newColumns.Count > 0) + { + if (newColumns.Contains(item)) + { + bind = new Binding(string.Format("CustomFields[{0}]", item.Field)) {Mode = BindingMode.OneWay}; + } + else + { + bind = new Binding(item.Field) { Mode = BindingMode.OneWay }; + } + } + else + { + bind = new Binding(item.Field) { Mode = BindingMode.OneWay }; + } + + bind.ConverterCulture = System.Globalization.CultureInfo.GetCultureInfo(Properties.Resources.CultureName); if (!String.IsNullOrWhiteSpace(item.StringFormat)) bind.StringFormat = item.StringFormat; col.Binding = bind; diff --git a/src/YALV/MainWindow.xaml.cs b/src/YALV/MainWindow.xaml.cs index 7ff6acc..b2e059e 100644 --- a/src/YALV/MainWindow.xaml.cs +++ b/src/YALV/MainWindow.xaml.cs @@ -19,6 +19,7 @@ using System.Globalization; using System.Windows; using System.Windows.Controls; +using System.Windows.Data; using System.Windows.Input; using YALV.Common; using YALV.Common.Interfaces; @@ -49,6 +50,9 @@ public MainWindow(string[] args) _vm.RefreshUI = OnRefreshUI; this.DataContext = _vm; + dgItems.EnableColumnVirtualization = true; + dgItems.EnableRowVirtualization = true; + //Assign events dgItems.SelectionChanged += dgItems_SelectionChanged; txtItemId.KeyUp += txtItemId_KeyUp; @@ -111,13 +115,14 @@ private void OnRefreshUI(string eventName, object parameter = null) { try { + switch (eventName) { case MainWindowVM.NOTIFY_ScrollIntoView: if (dgItems != null && dgItems.SelectedItem != null) { - dgItems.UpdateLayout(); - dgItems.ScrollIntoView(dgItems.SelectedItem); + //dgItems.UpdateLayout(); + //dgItems.ScrollIntoView(dgItems.SelectedItem); } break; default: diff --git a/src/YALV/ViewModel/MainWindowVM.cs b/src/YALV/ViewModel/MainWindowVM.cs index 9a42551..85e3d90 100644 --- a/src/YALV/ViewModel/MainWindowVM.cs +++ b/src/YALV/ViewModel/MainWindowVM.cs @@ -1329,6 +1329,9 @@ where levelCheckFilter(it) SelectedLogItem = lastItem != null ? lastItem : Items[Items.Count - 1]; } + + var logItem = (List)((object[])e.Result)[0]; + ReInitDataGridWithNewColumns(logItem[0].CustomFields); } } IsLoading = false; @@ -1345,31 +1348,58 @@ where levelCheckFilter(it) public void InitDataGrid() { + return; if (GridManager != null) { - IList dgColumns = new List() - { - new ColumnItem("Id", 37, null, CellAlignment.CENTER,string.Empty){Header = Resources.MainWindowVM_InitDataGrid_IdColumn_Header}, - new ColumnItem("TimeStamp", 120, null, CellAlignment.CENTER, GlobalHelper.DisplayDateTimeFormat){Header = Resources.MainWindowVM_InitDataGrid_TimeStampColumn_Header}, - new ColumnItem("Level", null, 50, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_LevelColumn_Header}, - new ColumnItem("Message", null, 300){Header = Resources.MainWindowVM_InitDataGrid_MessageColumn_Header}, - new ColumnItem("Logger", 150, null){Header = Resources.MainWindowVM_InitDataGrid_LoggerColumn_Header}, - new ColumnItem("MachineName", 110, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_MachineNameColumn_Header}, - new ColumnItem("HostName", 110, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_HostNameColumn_Header}, - new ColumnItem("UserName", 110, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_UserNameColumn_Header}, - new ColumnItem("App", 150, null){Header = Resources.MainWindowVM_InitDataGrid_AppColumn_Header}, - new ColumnItem("Thread", 44, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_ThreadColumn_Header}, - new ColumnItem("Class", null, 300){Header = Resources.MainWindowVM_InitDataGrid_ClassColumn_Header}, - new ColumnItem("Method", 200, null){Header = Resources.MainWindowVM_InitDataGrid_MethodColumn_Header} - //new ColumnItem("Delta", 60, null, CellAlignment.CENTER, null, "Δ"), - //new ColumnItem("Path", 50) - }; + IList dgColumns = GetDefaultColumns(); GridManager.BuildDataGrid(dgColumns); GridManager.AssignSource(new Binding(MainWindowVM.PROP_Items) { Source = this, Mode = BindingMode.OneWay }); GridManager.OnBeforeCheckFilter = levelCheckFilter; } } + private List GetDefaultColumns() + { + return new List() + { + new ColumnItem("Id", 37, null, CellAlignment.CENTER,string.Empty){Header = Resources.MainWindowVM_InitDataGrid_IdColumn_Header}, + new ColumnItem("TimeStamp", 120, null, CellAlignment.CENTER, GlobalHelper.DisplayDateTimeFormat){Header = Resources.MainWindowVM_InitDataGrid_TimeStampColumn_Header}, + new ColumnItem("Level", null, 50, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_LevelColumn_Header}, + new ColumnItem("Message", null, 300){Header = Resources.MainWindowVM_InitDataGrid_MessageColumn_Header}, + new ColumnItem("Logger", 150, null){Header = Resources.MainWindowVM_InitDataGrid_LoggerColumn_Header}, + new ColumnItem("MachineName", 110, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_MachineNameColumn_Header}, + new ColumnItem("HostName", 110, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_HostNameColumn_Header}, + new ColumnItem("UserName", 110, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_UserNameColumn_Header}, + new ColumnItem("App", 150, null){Header = Resources.MainWindowVM_InitDataGrid_AppColumn_Header}, + new ColumnItem("Thread", 44, null, CellAlignment.CENTER){Header = Resources.MainWindowVM_InitDataGrid_ThreadColumn_Header}, + new ColumnItem("Class", null, 300){Header = Resources.MainWindowVM_InitDataGrid_ClassColumn_Header}, + new ColumnItem("Method", 200, null){Header = Resources.MainWindowVM_InitDataGrid_MethodColumn_Header} + }; + } + + + public void ReInitDataGridWithNewColumns(Dictionary customFields) + { + if (GridManager != null) + { + var dgColumns = GetDefaultColumns(); + + var newColumns = new List(); + foreach (var field in customFields) + { + var column = new ColumnItem(field.Key, null, 200) + { + Header = field.Key + }; + newColumns.Add(column); + dgColumns.Add(column); + } + + GridManager.BuildDataGrid(dgColumns, newColumns); + GridManager.AssignSource(new Binding(MainWindowVM.PROP_Items) { Source = this, Mode = BindingMode.OneWay }); + GridManager.OnBeforeCheckFilter = levelCheckFilter; + } + } public void RefreshView() { if (GridManager != null) From 75ed3b348be8dbda51e675f94a5033c135ceb0e3 Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Mon, 20 Jun 2016 11:15:46 +0300 Subject: [PATCH 2/9] Bug fixes --- src/YALV/Common/FilteredGridManager.cs | 4 ++-- src/YALV/ViewModel/MainWindowVM.cs | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/YALV/Common/FilteredGridManager.cs b/src/YALV/Common/FilteredGridManager.cs index f573ba8..45c3fe5 100644 --- a/src/YALV/Common/FilteredGridManager.cs +++ b/src/YALV/Common/FilteredGridManager.cs @@ -103,13 +103,13 @@ public void BuildDataGrid(IList columns, List newColumns Style txtStyle = Application.Current.FindResource("RoundWatermarkTextBox") as Style; if (txtStyle != null) txt.Style = txtStyle; - txt.Name = getTextBoxName(item.Field); + txt.Name = getTextBoxName(item.Field.Replace(" ", "")); txt.ToolTip = String.Format(Resources.FilteredGridManager_BuildDataGrid_FilterTextBox_Tooltip, item.Header); txt.Tag = txt.ToolTip.ToString().ToLower(); txt.Text = string.Empty; txt.AcceptsReturn = false; txt.SetBinding(TextBox.WidthProperty, widthBind); - _filterPropertyList.Add(item.Field); + _filterPropertyList.Add(item.Field.Replace(" ","")); if (_keyUpEvent != null) txt.KeyUp += _keyUpEvent; diff --git a/src/YALV/ViewModel/MainWindowVM.cs b/src/YALV/ViewModel/MainWindowVM.cs index 85e3d90..9f83536 100644 --- a/src/YALV/ViewModel/MainWindowVM.cs +++ b/src/YALV/ViewModel/MainWindowVM.cs @@ -1330,8 +1330,12 @@ where levelCheckFilter(it) SelectedLogItem = lastItem != null ? lastItem : Items[Items.Count - 1]; } - var logItem = (List)((object[])e.Result)[0]; - ReInitDataGridWithNewColumns(logItem[0].CustomFields); + var result = (List)((object[])e.Result)[0]; + var maxCustomFields = result.Max(c => c.CustomFields.Count); + + var logItem = result.First(r => r.CustomFields.Count == maxCustomFields); + + ReInitDataGridWithNewColumns(logItem.CustomFields); } } IsLoading = false; @@ -1348,7 +1352,6 @@ where levelCheckFilter(it) public void InitDataGrid() { - return; if (GridManager != null) { IList dgColumns = GetDefaultColumns(); From 5e9fec6a664516968033735c9d1432fc8878a6d6 Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Mon, 20 Jun 2016 11:37:39 +0300 Subject: [PATCH 3/9] Added back UpdateLayout that was commented out for testing --- src/YALV/MainWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/YALV/MainWindow.xaml.cs b/src/YALV/MainWindow.xaml.cs index b2e059e..b1a94f3 100644 --- a/src/YALV/MainWindow.xaml.cs +++ b/src/YALV/MainWindow.xaml.cs @@ -121,8 +121,8 @@ private void OnRefreshUI(string eventName, object parameter = null) case MainWindowVM.NOTIFY_ScrollIntoView: if (dgItems != null && dgItems.SelectedItem != null) { - //dgItems.UpdateLayout(); - //dgItems.ScrollIntoView(dgItems.SelectedItem); + dgItems.UpdateLayout(); + dgItems.ScrollIntoView(dgItems.SelectedItem); } break; default: From e4976b735ad1e7982b37b3ada692804077c69d67 Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Fri, 1 Jul 2016 14:27:26 +0300 Subject: [PATCH 4/9] Added the ability to filter custom columns --- src/YALV.sln | 7 ++++++- src/YALV/Common/FilteredGridManager.cs | 1 + src/YALV/Common/FilteredGridManagerBase.cs | 14 ++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/YALV.sln b/src/YALV.sln index b24ea8b..e2db653 100644 --- a/src/YALV.sln +++ b/src/YALV.sln @@ -1,6 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 14 +VisualStudioVersion = 14.0.25123.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YALV", "YALV\YALV.csproj", "{D9109556-5B27-4FF2-AB53-837DF91A5466}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YALV.Samples", "YALV.Samples\YALV.Samples.csproj", "{5276151E-F717-4893-9A09-C9DD3CE65F83}" @@ -8,6 +10,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YALV.Core", "YALV.Core\YALV.Core.csproj", "{D8EFA045-5482-4BBA-A1BF-28667D5F4635}" EndProject Global + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 diff --git a/src/YALV/Common/FilteredGridManager.cs b/src/YALV/Common/FilteredGridManager.cs index 45c3fe5..5c5137b 100644 --- a/src/YALV/Common/FilteredGridManager.cs +++ b/src/YALV/Common/FilteredGridManager.cs @@ -51,6 +51,7 @@ public void BuildDataGrid(IList columns, List newColumns if (columns != null) { _dg.Columns.Clear(); + _txtSearchPanel.Children.Clear(); foreach (ColumnItem item in columns) { DataGridTextColumn col = new DataGridTextColumn(); diff --git a/src/YALV/Common/FilteredGridManagerBase.cs b/src/YALV/Common/FilteredGridManagerBase.cs index 79dc0b1..70c2af6 100644 --- a/src/YALV/Common/FilteredGridManagerBase.cs +++ b/src/YALV/Common/FilteredGridManagerBase.cs @@ -202,8 +202,18 @@ protected object getItemValue(object item, string prop) } catch { - val = null; - } + try + { + var custom = item.GetType().GetProperty("CustomFields"); + var inf = custom.GetValue(item, null); + + val = ((Dictionary) inf)[prop]; + } + catch + { + val = null; + } + } return val; } From fd9aea23591103252491059ad40418591fbcc76d Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Sat, 23 Jul 2016 01:47:47 +0300 Subject: [PATCH 5/9] Update README.md --- README.md | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 16bb004..b00df68 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,8 @@ -# YALV! - Yet Another Log4Net Viewer +# D-YALV! - (Dynamic) Yet Another Log4Net Viewer YALV! is a log file viewer for Log4Net with handy features like log merging, filtering, open most recently used files, items sorting and so on. It is easy to use, it requires no configuration, it has intuitive and user-friendly interface and available in several languages. It is a WPF Application based on .NET Framework 4.0 and written in C# language. -![Screenshot](/doc/images/YALV-Win.png?raw=true "YALV Main Window") -[More Screenshots](https://github.com/LukePet/YALV/wiki/Screenshots) - -## Main features -* Log files merging into one list -* Dynamic log events filtering -* Dynamic show/hide log events by log level -* Favorites log folders list -* Open most recently used files -* Sort and reorder columns -* Copy log event data to clipboard -* Open files by dragging them to the main window - -## Localizations -* English -* French -* German -* Italian -* Russian -* Japanese -* Chinese -* Greek - -## Configuration -YALV itself does not require any setup, but log4net must be setup in your application to write XML content in XmlLayoutSchemaLog4j layout to log files. [Read more...](https://github.com/LukePet/YALV/wiki) +D-YALV is a fork of YALV! that supports custom columns & data. During your applications execution, just log your custom data as a element, and D-YALV will show them dynamically. ## Usage -Download latest binaries, unzip and launch YALV.exe. That's all! -YALV GUI language follows your Windows culture automatically, but you can override this behavior. +Use it just like how you would use YALV!. From 485844b113f51e9f3fbf5447d756faaebeb176e7 Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Tue, 6 Sep 2016 16:16:07 +0300 Subject: [PATCH 6/9] Update README.md --- README.md | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b00df68..eaf290f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,29 @@ YALV! is a log file viewer for Log4Net with handy features like log merging, filtering, open most recently used files, items sorting and so on. It is easy to use, it requires no configuration, it has intuitive and user-friendly interface and available in several languages. It is a WPF Application based on .NET Framework 4.0 and written in C# language. -D-YALV is a fork of YALV! that supports custom columns & data. During your applications execution, just log your custom data as a element, and D-YALV will show them dynamically. +D-YALV is a fork of YALV! that supports custom columns & data. During your applications execution, just log your custom data as a element, like so: + +```xml + + Testing logs.. + + + + + + + + + + + + + + + +``` + +and D-YALV will show them just like a default log4net column. ## Usage Use it just like how you would use YALV!. From 9a61a46ce227302a73136af7843f9b19a1f092d4 Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Tue, 6 Sep 2016 16:16:46 +0300 Subject: [PATCH 7/9] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eaf290f..c4ffa1e 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ D-YALV is a fork of YALV! that supports custom columns & data. During your appli - + ``` From ebe227f2c10c8c6085ad214cb2c47bfbd04f5e04 Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Tue, 6 Sep 2016 16:17:36 +0300 Subject: [PATCH 8/9] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c4ffa1e..ea66ee8 100644 --- a/README.md +++ b/README.md @@ -16,8 +16,8 @@ D-YALV is a fork of YALV! that supports custom columns & data. During your appli - - + + From 75cf9dd736685c08885bb73fbb1063e347443b6c Mon Sep 17 00:00:00 2001 From: Umut Seven Date: Tue, 6 Sep 2016 16:37:12 +0300 Subject: [PATCH 9/9] Fixed some crashes --- src/YALV.Core/YALV.Core.csproj | 1 + src/YALV.sln | 3 -- src/YALV/Common/FilteredGridManagerBase.cs | 45 +++++++++++----------- src/YALV/ViewModel/MainWindowVM.cs | 18 +++++---- src/YALV/YALV.csproj | 1 + 5 files changed, 35 insertions(+), 33 deletions(-) diff --git a/src/YALV.Core/YALV.Core.csproj b/src/YALV.Core/YALV.Core.csproj index c33438e..9c76008 100644 --- a/src/YALV.Core/YALV.Core.csproj +++ b/src/YALV.Core/YALV.Core.csproj @@ -29,6 +29,7 @@ TRACE prompt 4 + false diff --git a/src/YALV.sln b/src/YALV.sln index e2db653..0d49ce6 100644 --- a/src/YALV.sln +++ b/src/YALV.sln @@ -10,9 +10,6 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "YALV.Core", "YALV.Core\YALV.Core.csproj", "{D8EFA045-5482-4BBA-A1BF-28667D5F4635}" EndProject Global - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Debug|x86 = Debug|x86 diff --git a/src/YALV/Common/FilteredGridManagerBase.cs b/src/YALV/Common/FilteredGridManagerBase.cs index 70c2af6..2952296 100644 --- a/src/YALV/Common/FilteredGridManagerBase.cs +++ b/src/YALV/Common/FilteredGridManagerBase.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; +using System.Linq; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; @@ -20,7 +21,6 @@ public FilteredGridManagerBase(DataGrid dg, Panel txtSearchPanel, KeyEventHandle _txtSearchPanel = txtSearchPanel; _keyUpEvent = keyUpEvent; _filterPropertyList = new List(); - _txtCache = new Hashtable(); IsFilteringEnabled = true; } @@ -138,15 +138,9 @@ protected bool itemCheckFilter(object item) foreach (string prop in _filterPropertyList) { TextBox txt = null; - if (_txtCache.ContainsKey(prop)) - txt = _txtCache[prop] as TextBox; - else - { - txt = _txtSearchPanel.FindName(getTextBoxName(prop)) as TextBox; - _txtCache[prop] = txt; - } + txt = _txtSearchPanel.FindName(getTextBoxName(prop)) as TextBox; - res = false; + res = false; if (txt == null) res = true; else @@ -196,25 +190,30 @@ protected bool itemCheckFilter(object item) protected object getItemValue(object item, string prop) { object val = null; - try - { - val = item.GetType().GetProperty(prop).GetValue(item, null); - } - catch - { - try - { - var custom = item.GetType().GetProperty("CustomFields"); + + var type = item.GetType(); + var properties = type.GetProperties(); + + var isBase = properties.Any(p => p.Name == prop); + if (isBase) + { + val = type.GetProperty(prop).GetValue(item, null); + } + else + { + try + { + var custom = type.GetProperty("CustomFields"); var inf = custom.GetValue(item, null); - val = ((Dictionary) inf)[prop]; - } - catch - { + val = ((Dictionary)inf)[prop]; + } + catch (Exception) + { val = null; } } - return val; + return val; } #endregion diff --git a/src/YALV/ViewModel/MainWindowVM.cs b/src/YALV/ViewModel/MainWindowVM.cs index 9f83536..73e6ea6 100644 --- a/src/YALV/ViewModel/MainWindowVM.cs +++ b/src/YALV/ViewModel/MainWindowVM.cs @@ -1330,14 +1330,18 @@ where levelCheckFilter(it) SelectedLogItem = lastItem != null ? lastItem : Items[Items.Count - 1]; } - var result = (List)((object[])e.Result)[0]; - var maxCustomFields = result.Max(c => c.CustomFields.Count); + var result = (List)((object[])e.Result)[0]; + if (result.Count > 0) + { + var maxCustomFields = result.Max(c => c.CustomFields.Count); - var logItem = result.First(r => r.CustomFields.Count == maxCustomFields); - - ReInitDataGridWithNewColumns(logItem.CustomFields); - } - } + var logItem = result.First(r => r.CustomFields.Count == maxCustomFields); + + ReInitDataGridWithNewColumns(logItem.CustomFields); + } + + } + } IsLoading = false; } diff --git a/src/YALV/YALV.csproj b/src/YALV/YALV.csproj index 7731610..7616257 100644 --- a/src/YALV/YALV.csproj +++ b/src/YALV/YALV.csproj @@ -68,6 +68,7 @@ ;c:\Program Files (x86)\Microsoft Visual Studio 10.0\Team Tools\Static Analysis Tools\FxCop\\Rules false false + false