Users.Forms.UserManagementDlg : Sorting by data in columns including a surname, ver. 2.18.981
This commit is contained in:
parent
540bc8ca74
commit
69b7c94176
@ -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")]
|
||||
|
||||
103
Users/Forms/ListViewExtensions.cs
Normal file
103
Users/Forms/ListViewExtensions.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Users/Forms/LviIntColumnComparer.cs
Normal file
31
Users/Forms/LviIntColumnComparer.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
54
Users/Forms/LviNameSurnameColumnComparer.cs
Normal file
54
Users/Forms/LviNameSurnameColumnComparer.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
31
Users/Forms/LviTextColumnComparer.cs
Normal file
31
Users/Forms/LviTextColumnComparer.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
1
Users/Forms/UserManagementDlg.designer.cs
generated
1
Users/Forms/UserManagementDlg.designer.cs
generated
@ -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);
|
||||
//
|
||||
|
||||
@ -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")]
|
||||
|
||||
@ -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" />
|
||||
|
||||
Loading…
Reference in New Issue
Block a user