diff --git a/Terminal.Gui/Views/TableView.cs b/Terminal.Gui/Views/TableView.cs
index 55504e14a..5395e70b6 100644
--- a/Terminal.Gui/Views/TableView.cs
+++ b/Terminal.Gui/Views/TableView.cs
@@ -179,7 +179,7 @@ namespace Terminal.Gui {
selectedColumn = Table == null ? 0 : Math.Min (Table.Columns.Count - 1, Math.Max (0, value));
if(oldValue != selectedColumn)
- OnSelectedCellChanged();
+ OnSelectedCellChanged(new SelectedCellChangedEventArgs(Table,oldValue,SelectedColumn,SelectedRow,SelectedRow));
}
}
@@ -190,12 +190,12 @@ namespace Terminal.Gui {
get => selectedRow;
set {
- var oldValue = selectedColumn;
+ var oldValue = selectedRow;
selectedRow = Table == null ? 0 : Math.Min (Table.Rows.Count - 1, Math.Max (0, value));
if(oldValue != selectedRow)
- OnSelectedCellChanged();
+ OnSelectedCellChanged(new SelectedCellChangedEventArgs(Table,SelectedColumn,SelectedColumn,oldValue,selectedRow));
}
}
@@ -217,7 +217,7 @@ namespace Terminal.Gui {
///
/// This event is raised when the selected cell in the table changes.
///
- public event Action SelectedCellChanged;
+ public event Action SelectedCellChanged;
///
/// Initialzies a class using layout.
@@ -715,9 +715,9 @@ namespace Terminal.Gui {
///
/// Invokes the event
///
- protected virtual void OnSelectedCellChanged()
+ protected virtual void OnSelectedCellChanged(SelectedCellChangedEventArgs args)
{
- SelectedCellChanged?.Invoke(new EventArgs());
+ SelectedCellChanged?.Invoke(args);
}
///
@@ -853,4 +853,61 @@ namespace Terminal.Gui {
X = x;
}
}
+
+ ///
+ /// Defines the event arguments for
+ ///
+ public class SelectedCellChangedEventArgs : EventArgs
+ {
+ ///
+ /// The current table to which the new indexes refer. May be null e.g. if selection change is the result of clearing the table from the view
+ ///
+ ///
+ public DataTable Table {get;}
+
+
+ ///
+ /// The previous selected column index. May be invalid e.g. when the selection has been changed as a result of replacing the existing Table with a smaller one
+ ///
+ ///
+ public int OldCol {get;}
+
+
+ ///
+ /// The newly selected column index.
+ ///
+ ///
+ public int NewCol {get;}
+
+
+ ///
+ /// The previous selected row index. May be invalid e.g. when the selection has been changed as a result of deleting rows from the table
+ ///
+ ///
+ public int OldRow {get;}
+
+
+ ///
+ /// The newly selected row index.
+ ///
+ ///
+ public int NewRow {get;}
+
+ ///
+ /// Creates a new instance of arguments describing a change in selected cell in a
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public SelectedCellChangedEventArgs(DataTable t, int oldCol, int newCol, int oldRow, int newRow)
+ {
+ Table = t;
+ OldCol = oldCol;
+ NewCol = newCol;
+ OldRow = oldRow;
+ NewRow = newRow;
+ }
+ }
}
diff --git a/UnitTests/TableViewTests.cs b/UnitTests/TableViewTests.cs
index c4819d251..481facd06 100644
--- a/UnitTests/TableViewTests.cs
+++ b/UnitTests/TableViewTests.cs
@@ -67,6 +67,66 @@ namespace UnitTests {
Assert.Equal(1,tableView.RowOffset);
Assert.Equal(1,tableView.ColumnOffset);
}
+
+ [Fact]
+ public void SelectedCellChanged_NotFiredForSameValue()
+ {
+ var tableView = new TableView(){
+ Table = BuildTable(25,50)
+ };
+
+ bool called = false;
+ tableView.SelectedCellChanged += (e)=>{called=true;};
+
+ Assert.Equal(0,tableView.SelectedColumn);
+ Assert.False(called);
+
+ // Changing value to same as it already was should not raise an event
+ tableView.SelectedColumn = 0;
+
+ Assert.False(called);
+
+ tableView.SelectedColumn = 10;
+ Assert.True(called);
+ }
+
+
+
+ [Fact]
+ public void SelectedCellChanged_SelectedColumnIndexesCorrect()
+ {
+ var tableView = new TableView(){
+ Table = BuildTable(25,50)
+ };
+
+ bool called = false;
+ tableView.SelectedCellChanged += (e)=>{
+ called=true;
+ Assert.Equal(0,e.OldCol);
+ Assert.Equal(10,e.NewCol);
+ };
+
+ tableView.SelectedColumn = 10;
+ Assert.True(called);
+ }
+
+ [Fact]
+ public void SelectedCellChanged_SelectedRowIndexesCorrect()
+ {
+ var tableView = new TableView(){
+ Table = BuildTable(25,50)
+ };
+
+ bool called = false;
+ tableView.SelectedCellChanged += (e)=>{
+ called=true;
+ Assert.Equal(0,e.OldRow);
+ Assert.Equal(10,e.NewRow);
+ };
+
+ tableView.SelectedRow = 10;
+ Assert.True(called);
+ }
///
/// Builds a simple table of string columns with the requested number of columns and rows