Users.Forms.UserManagementDlg : Sorting by data in columns including a surname, ver. 2.18.981

This commit is contained in:
Milan Hanajik 2018-08-14 11:10:34 +02:00
parent 540bc8ca74
commit 69b7c94176
9 changed files with 297 additions and 15 deletions

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.18.979.0")]
[assembly: AssemblyFileVersion("2.18.979.0")]
[assembly: AssemblyVersion("2.18.980.0")]
[assembly: AssemblyFileVersion("2.18.980.0")]

View File

@ -0,0 +1,103 @@
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace Users.Forms
{
[EditorBrowsable(EditorBrowsableState.Never)]
public static class ListViewExtensions
{
[StructLayout(LayoutKind.Sequential)]
public struct HDITEM
{
public Mask mask;
public int cxy;
[MarshalAs(UnmanagedType.LPTStr)]
public string pszText;
public IntPtr hbm;
public int cchTextMax;
public Format fmt;
public IntPtr lParam;
// _WIN32_IE >= 0x0300
public int iImage;
public int iOrder;
// _WIN32_IE >= 0x0500
public uint type;
public IntPtr pvFilter;
// _WIN32_WINNT >= 0x0600
public uint state;
[Flags]
public enum Mask
{
Format = 0x4, // HDI_FORMAT
};
[Flags]
public enum Format
{
SortDown = 0x200, // HDF_SORTDOWN
SortUp = 0x400, // HDF_SORTUP
};
};
public const int LVM_FIRST = 0x1000;
public const int LVM_GETHEADER = LVM_FIRST + 31;
public const int HDM_FIRST = 0x1200;
public const int HDM_GETITEM = HDM_FIRST + 11;
public const int HDM_SETITEM = HDM_FIRST + 12;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, ref HDITEM lParam);
public static void SetSortIcon(this ListView listViewControl, int columnIndex, MySortOrder order)
{
IntPtr columnHeader = SendMessage(listViewControl.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
for (int columnNumber = 0; columnNumber <= listViewControl.Columns.Count - 1; columnNumber++)
{
var columnPtr = new IntPtr(columnNumber);
var item = new HDITEM
{
mask = HDITEM.Mask.Format
};
if (SendMessage(columnHeader, HDM_GETITEM, columnPtr, ref item) == IntPtr.Zero)
{
throw new Win32Exception();
}
if (order != MySortOrder.None && columnNumber == columnIndex)
{
switch (order)
{
case MySortOrder.Ascending:
case MySortOrder.Ascending2:
item.fmt &= ~HDITEM.Format.SortDown;
item.fmt |= HDITEM.Format.SortUp;
break;
case MySortOrder.Descending:
case MySortOrder.Descending2:
item.fmt &= ~HDITEM.Format.SortUp;
item.fmt |= HDITEM.Format.SortDown;
break;
}
}
else
{
item.fmt &= ~HDITEM.Format.SortDown & ~HDITEM.Format.SortUp;
}
if (SendMessage(columnHeader, HDM_SETITEM, columnPtr, ref item) == IntPtr.Zero)
{
throw new Win32Exception();
}
}
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections;
using System.Windows.Forms;
namespace Users.Forms
{
class LviIntColumnComparer : IComparer
{
int column;
MySortOrder order;
public LviIntColumnComparer()
{
column = 0;
order = MySortOrder.Ascending;
}
public LviIntColumnComparer(int column, MySortOrder order)
{
this.column = column;
this.order = order;
}
public int Compare(object x, object y)
{
int valX = int.Parse(((ListViewItem)x).SubItems[column].Text);
int valY = int.Parse(((ListViewItem)y).SubItems[column].Text);
return (order == MySortOrder.Descending || order == MySortOrder.Descending2) ? (valY - valX) : (valX - valY);
}
}
}

View File

@ -0,0 +1,54 @@
using System;
using System.Collections;
using System.Windows.Forms;
namespace Users.Forms
{
class LviNameSurnameColumnComparer : IComparer
{
private int column;
MySortOrder order;
public LviNameSurnameColumnComparer()
{
column = 0;
order = MySortOrder.Ascending;
}
public LviNameSurnameColumnComparer(int column, MySortOrder order)
{
this.column = column;
this.order = order;
}
public int Compare(object x, object y)
{
string nameX = ((ListViewItem)x).SubItems[column].Text;
string nameY = ((ListViewItem)y).SubItems[column].Text;
string surnameX;
string surnameY;
switch (order)
{
case MySortOrder.Ascending:
return String.Compare(nameX, nameY);
case MySortOrder.Descending:
return String.Compare(nameY, nameX);
case MySortOrder.Ascending2:
surnameX = (nameX.IndexOf(' ') > 0) ? nameX.Substring(nameX.IndexOf(' ') + 1) : nameX;
surnameY = (nameX.IndexOf(' ') > 0) ? nameY.Substring(nameY.IndexOf(' ') + 1) : nameY;
return String.Compare(surnameX, surnameY);
case MySortOrder.Descending2:
surnameX = (nameX.IndexOf(' ') > 0) ? nameX.Substring(nameX.IndexOf(' ') + 1) : nameX;
surnameY = (nameX.IndexOf(' ') > 0) ? nameY.Substring(nameY.IndexOf(' ') + 1) : nameY;
return String.Compare(surnameY, surnameX);
default:
return 0;
}
}
}
}

View File

@ -0,0 +1,31 @@
using System;
using System.Collections;
using System.Windows.Forms;
namespace Users.Forms
{
class LviTextColumnComparer : IComparer
{
private int column;
MySortOrder order;
public LviTextColumnComparer()
{
column = 0;
order = MySortOrder.Ascending;
}
public LviTextColumnComparer(int column, MySortOrder order)
{
this.column = column;
this.order = order;
}
public int Compare(object x, object y)
{
string txtX = ((ListViewItem)x).SubItems[column].Text;
string txtY = ((ListViewItem)y).SubItems[column].Text;
return (order == MySortOrder.Descending || order == MySortOrder.Descending2) ? String.Compare(txtY, txtX) : String.Compare(txtX, txtY);
}
}
}

View File

@ -11,14 +11,32 @@ using Users.Resources;
namespace Users.Forms
{
public enum MySortOrder
{
None,
Ascending, /// Th esame like SortOrder.Ascending
Descending, /// The same like SortOrder.Descending
Ascending2, /// Sorts by a surname in ascending order in case or 'Name Surname' column
Descending2, /// Sorts by a surname in descending order in case or 'Name Surname' column
}
public partial class UserManagementDlg: Form
{
const int UserNumberColumn = 1;
const int NameSurnameColumn = 2;
public string TitleExtension;
NHibernate.ISession session;
bool showExtensions;
IList<User> ListOfUsers;
int LastSelectedIndex;
IList<User> listOfUsers;
int lastSelectedIndex;
MySortOrder sortOrder = MySortOrder.Ascending;
int sortColumn = -1; /// 0-based index of column to be used for sorting
public UserManagementDlg(NHibernate.ISession session, bool showLocalExtensions)
{
@ -36,9 +54,9 @@ namespace Users.Forms
deleteButton.Text = Strings.RemoveBtnText;
closeButton.Text = Strings.CloseBtnText;
listViewUsers.Columns.Add(Strings.User_name, 100);
listViewUsers.Columns.Add(Strings.User_code, 70);
listViewUsers.Columns.Add(Strings.Full_name, 150);
listViewUsers.Columns.Add(Strings.User_name, 100); /// column 0
listViewUsers.Columns.Add(Strings.User_code, 70); /// column 1: UserNumberColumn
listViewUsers.Columns.Add(Strings.Full_name, 150); /// column 2: NameSurnameColumn
#if TURA_IPERL || TURA_SPECIAL
listViewUsers.Columns.Add(Strings.Tag, 110);
#endif
@ -46,7 +64,7 @@ namespace Users.Forms
try
{
ListOfUsers = session.QueryOver<User>().List();
listOfUsers = session.QueryOver<User>().List();
}
catch (Exception exc)
{
@ -60,7 +78,7 @@ namespace Users.Forms
Cursor.Current = Cursors.WaitCursor;
listViewUsers.Items.Clear();
foreach (User u in ListOfUsers)
foreach (User u in listOfUsers)
{
string grps = string.Empty;
///
@ -122,14 +140,54 @@ namespace Users.Forms
RefreshButtonStates();
if (listViewUsers.SelectedItems.Count > 0)
{
LastSelectedIndex = listViewUsers.SelectedItems[0].Index;
lastSelectedIndex = listViewUsers.SelectedItems[0].Index;
}
else
{
LastSelectedIndex = -1;
lastSelectedIndex = -1;
}
}
private void listViewUsers_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (e.Column == sortColumn)
{
/// Clicked on the same column header => increment to the next applicable MySortOrder
if (e.Column == NameSurnameColumn)
{
sortOrder++;
if (sortOrder > MySortOrder.Descending2) sortOrder = MySortOrder.Ascending;
}
else
{
sortOrder = (sortOrder == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending;
}
}
else
{
/// Clicked on another column header => set sortOrder to MySortOrder.Ascending
sortColumn = e.Column;
sortOrder = MySortOrder.Ascending;
}
if (sortColumn == UserNumberColumn)
{
listViewUsers.ListViewItemSorter = new LviIntColumnComparer(sortColumn, sortOrder);
}
else if (sortColumn == NameSurnameColumn)
{
listViewUsers.ListViewItemSorter = new LviNameSurnameColumnComparer(sortColumn, sortOrder);
}
else
{
listViewUsers.ListViewItemSorter = new LviTextColumnComparer(sortColumn, sortOrder);
}
listViewUsers.SetSortIcon(sortColumn, sortOrder);
listViewUsers.Sort();
}
private void editButton_Click(object sender, EventArgs e)
{
if (listViewUsers.SelectedItems.Count == 1 && listViewUsers.SelectedItems[0].Tag is User)
@ -149,7 +207,7 @@ namespace Users.Forms
User newUser = new User();
if (new Forms.EditSelectedUser(session, newUser).ShowDialog() == DialogResult.OK)
{
ListOfUsers.Add(newUser);
listOfUsers.Add(newUser);
}
ListUsers();
}
@ -160,7 +218,7 @@ namespace Users.Forms
{
User Selecteduser = listViewUsers.SelectedItems[0].Tag as User;
Users.DB.DeleteObject(session, Selecteduser);
ListOfUsers.Remove(Selecteduser);
listOfUsers.Remove(Selecteduser);
ListUsers();
}
}

View File

@ -55,6 +55,7 @@ namespace Users.Forms
this.listViewUsers.Name = "listViewUsers";
this.listViewUsers.UseCompatibleStateImageBehavior = false;
this.listViewUsers.View = System.Windows.Forms.View.Details;
this.listViewUsers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.listViewUsers_ColumnClick);
this.listViewUsers.SelectedIndexChanged += new System.EventHandler(this.listViewUsers_SelectedIndexChanged);
this.listViewUsers.DoubleClick += new System.EventHandler(this.listViewUsers_DoubleClick);
//

View File

@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.18.979.0")]
[assembly: AssemblyFileVersion("2.18.979.0")]
[assembly: AssemblyVersion("2.18.981.0")]
[assembly: AssemblyFileVersion("2.18.981.0")]

View File

@ -58,6 +58,10 @@
</ItemGroup>
<ItemGroup>
<Compile Include="DBSettings.cs" />
<Compile Include="Forms\ListViewExtensions.cs" />
<Compile Include="Forms\LviNameSurnameColumnComparer.cs" />
<Compile Include="Forms\LviIntColumnComparer.cs" />
<Compile Include="Forms\LviTextColumnComparer.cs" />
<Compile Include="GlobalData.cs" />
<Compile Include="DB.cs" />
<Compile Include="Entities\Enums.cs" />