I am using telerik:RadGridView along with telerik:RadContextMenu.ContextMenu to generate a right click menu inside my application. I need to be able to grab the servername and session id from the selected row in order to pass to the Disconnect and Logoff functions. However I ma having difficulty grabbing the data I need.
Here is the XAML for the component
Here is the relevant code that handles the Right Click
Here is my session class
Which is populated by using the following code
Here is the XAML for the component
<telerik:RadGridView x:Name="UserSessionGrid" IsReadOnly="True" FontWeight="Bold" AutoGeneratingColumn="UserSessionGrid_AutoGeneratingColumn" CanUserResizeColumns="False" CanUserDeleteRows="False" CanUserResizeRows="False" ClipboardCopyMode="All" Copied="UserSessionGrid_Copied" > <telerik:RadContextMenu.ContextMenu> <telerik:RadContextMenu Opened="RadContextMenu_Opened" ItemClick="RadContextMenu_ItemClick"> <telerik:RadContextMenu.Items> <telerik:RadMenuItem Header="Copy" /> <telerik:RadMenuItem Header="Disconnect" /> <telerik:RadMenuItem Header="Logoff" /> </telerik:RadContextMenu.Items> </telerik:RadContextMenu> </telerik:RadContextMenu.ContextMenu></telerik:RadGridView>Here is the relevant code that handles the Right Click
/// <summary>/// Handles the ItemClick event of the RadContextMenu control./// </summary>/// <param name="sender">The source of the event.</param>/// <param name="e">The <see cref="Telerik.Windows.RadRoutedEventArgs"/> instance containing the event data.</param>private void RadContextMenu_ItemClick(object sender, Telerik.Windows.RadRoutedEventArgs e){ RadContextMenu menu = (RadContextMenu)sender; RadMenuItem clickedItem = e.OriginalSource as RadMenuItem; GridViewRow row = menu.GetClickedElement<GridViewRow>(); GridViewCell cell = menu.GetClickedElement<GridViewCell>(); GridViewRowItem rowitem = menu.GetClickedElement<GridViewRowItem>(); if (clickedItem != null && row != null) { string header = Convert.ToString(clickedItem.Header); switch (header) { case "Copy": Clipboard.SetText(cell.Value.ToString()); break; case "Disconnect": // Grab Server Name Column and Session ID Column Data break; case "Logoff": // Grab Server Name Column and Session ID Column Data break; default: break; } }}/// <summary>/// Handles the Opened event of the RadContextMenu control./// </summary>/// <param name="sender">The source of the event.</param>/// <param name="e">The <see cref="RoutedEventArgs"/> instance containing the event data.</param>private void RadContextMenu_Opened(object sender, RoutedEventArgs e){ RadContextMenu menu = (RadContextMenu)sender; GridViewRow row = menu.GetClickedElement<GridViewRow>(); if (row != null) { row.IsSelected = row.IsCurrent = true; GridViewCell cell = menu.GetClickedElement<GridViewCell>(); if (cell != null) { cell.IsCurrent = true; } } else { menu.IsOpen = false; }}Here is my session class
class Session{ public String Server { get; set; } public String Domain { get; set; } public String User { get; set; } public int sID { get; set; } public ConnectionState State { get; set; } public IPAddress IP { get; set; } public String Workstation { get; set; } public DateTime? Connect { get; set; } public DateTime? Login { get; set; } public TimeSpan Idle { get; set; } /// <summary> /// Initializes a new instance of the <see cref="Session"/> class. /// </summary> /// <param name="server">The server.</param> /// <param name="domain">The domain.</param> /// <param name="user">The user.</param> /// <param name="session">The session.</param> /// <param name="state">The state.</param> /// <param name="ip">The ip.</param> /// <param name="workstation">The workstation.</param> /// <param name="connect">The connect.</param> /// <param name="login">The login.</param> /// <param name="idle">The idle.</param> public Session (string server, string domain, string user, int session, ConnectionState state, IPAddress ip, string workstation, DateTime? connect, DateTime? login, TimeSpan idle) { this.Server = server.ToUpper(); this.Domain = domain.ToUpper(); this.User = user; this.sID = session; this.State = state; this.IP = ip; this.Workstation = workstation.ToUpper(); this.Connect = connect; this.Login = login; this.Idle = idle; }}Which is populated by using the following code
/// <summary> /// Handles the DoWork event of the worker control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="DoWorkEventArgs"/> instance containing the event data.</param> private void worker_DoWork(object sender, DoWorkEventArgs e) { App.Current.Dispatcher.Invoke((Action)delegate { UserSessionGrid.IsBusy = true; }); ITerminalServicesManager manager = new TerminalServicesManager(); foreach (var ServerName in ServerList) { using (ITerminalServer server = manager.GetRemoteServer(ServerName)) { try { server.Open(); foreach (ITerminalServicesSession session in server.GetSessions()) { items.Add(new Session(server.ServerName, session.DomainName, session.UserName, session.SessionId, session.ConnectionState, session.ClientIPAddress, session.WindowStationName, session.ConnectTime,session.LoginTime, session.IdleTime)); //worker.ReportProgress(session.SessionId); } server.Close(); } catch (Win32Exception) { } catch (SystemException) { } catch (Exception) { } } } }