math-suite/Source/MatrixCalculator/Helpers/GridViewHelper.cs

145 lines
4.9 KiB
C#
Raw Permalink Normal View History

2018-02-05 23:24:46 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MathNet.Numerics.LinearAlgebra;
namespace MatrixCalculator
{
static class GridViewHelper
{
/// <summary>
/// Loads a matrix in a DataGridView
/// </summary>
public static void PutMatrix(Matrix<double> m, DataGridView grid)
{
// Reset grid
grid.Rows.Clear();
grid.Columns.Clear();
// Add columns
for (int i = 0; i < m.ColumnCount; i++)
{
var col = new DataGridViewTextBoxColumn()
{
SortMode = DataGridViewColumnSortMode.NotSortable,
AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
};
grid.Columns.Add(col);
}
// Add rows and data
for (int i = 0; i < m.RowCount; i++)
{
grid.Rows.Add();
for (int j = 0; j < m.ColumnCount; j++)
grid[j, i].Value = MyDouble.String(m[i, j]);
}
}
/// <summary>
/// Gets the matrix from a DataGridView
/// </summary>
public static Matrix<double> GetMatrix(DataGridView grid)
{
Matrix<double> m = Matrix<double>.Build.Dense(grid.Rows.Count, grid.Columns.Count);
for (int i = 0; i < m.RowCount; i++)
for (int j = 0; j < m.ColumnCount; j++)
{
double temp = 0;
if (grid[j, i].Value != null)
double.TryParse(grid[j, i].Value.ToString(), out temp);
m[i, j] = temp;
}
return m;
}
/// <summary>
/// Resizes a DataGridView
/// </summary>
/// <param name="grid">The DataGridView</param>
/// <param name="ncols">The new number of columns</param>
/// <param name="nrows">The new number of rows</param>
public static void Resize(DataGridView grid, int ncols, int nrows)
{
// Add columns
while (grid.Columns.Count < ncols)
{
DataGridViewTextBoxColumn col = new DataGridViewTextBoxColumn()
{
AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells,
SortMode = DataGridViewColumnSortMode.NotSortable
};
grid.Columns.Add(col);
}
// Remove columns
while (grid.Columns.Count > ncols)
grid.Columns.Remove(grid.Columns.GetLastColumn(DataGridViewElementStates.Displayed, DataGridViewElementStates.None));
// Add rows
while (grid.Rows.Count < nrows)
grid.Rows.Add();
// Remove rows
while (grid.Rows.Count > nrows)
grid.Rows.RemoveAt(grid.Rows.GetLastRow(DataGridViewElementStates.Displayed));
}
/// <summary>
/// Copies the selected area to clipboard
/// </summary>
public static void CopySelected(DataGridView grid)
{
int minRow, minCol, maxRow, maxCol;
minRow = minCol = int.MaxValue;
maxRow = maxCol = int.MinValue;
foreach (DataGridViewCell i in grid.SelectedCells)
{
minRow = Math.Min(minRow, i.RowIndex);
minCol = Math.Min(minCol, i.ColumnIndex);
maxRow = Math.Max(maxRow, i.RowIndex);
maxCol = Math.Max(maxCol, i.ColumnIndex);
}
string csv = CsvParser.ToCSV(grid, minRow, minCol, maxRow, maxCol, true);
Clipboard.SetText(csv, TextDataFormat.CommaSeparatedValue);
}
/// <summary>
/// Pastes clipboard content into selected cell and beyond
/// </summary>
public static void Paste(DataGridView grid)
{
// Where to paste
int row = 0, col = 0;
if (grid.CurrentCell != null) {
row = grid.CurrentCell.RowIndex;
col = grid.CurrentCell.ColumnIndex;
}
// Get data
string data = "";
if (Clipboard.ContainsText(TextDataFormat.CommaSeparatedValue)) data = Clipboard.GetText(TextDataFormat.CommaSeparatedValue);
else if (Clipboard.ContainsText()) data = Clipboard.GetText();
var table = CsvParser.GetTable(data, MatrixCalculator.Properties.Settings.Default.InternalCsvSeparators.ToArray());
// Put data in table
for (int i = 0; i < table.Rows.Count; i++)
for (int j = 0; j < table.Columns.Count; j++)
if (table.Rows[i][j].ToString() != "" && row + i < grid.Rows.Count && col + j < grid.Columns.Count)
grid[j + col, i + row].Value = table.Rows[i][j];
}
}
}