/// <summary> /// Event handler for "cell end edit" /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { try { DataGridView dgv = sender as DataGridView; SpreadsheetEngine.AbstractCell editedCell = _spreadsheet.GetCell(e.RowIndex, e.ColumnIndex); // grab reference to backend cell being edited if (dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null) { editedCell.Text = dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString(); // update reference's text } else { editedCell.Text = ""; // if user removes all text... need to set text to nothing } dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = editedCell.Value; // display the value rather than the text. } catch (IndexOutOfRangeException ex) { MessageBox.Show( ex.Message, "Index Out Of Range Error", MessageBoxButtons.OK ); } }
/// <summary> /// Demo: randomly assign 50 cells to a test string; set column B cells to "This is cell B#"; /// and set column A cells to "=B#". /// </summary> private void Demo() { // First, randomly assign 50 cells to "Testing" string. Random rnd = new Random(); // construct random instance for (int i = 0; i < 50; i++) { SpreadsheetEngine.AbstractCell cell = _spreadsheet.GetCell(rnd.Next(0, Constants.numberOfRows), rnd.Next(0, Constants.numberOfColumns)); // get reference to random cell cell.Text = "Testing"; // set cell's text to the test message } // Second, assign every row in column B to "This is cell B#." Where # is actual row number. for (int i = 0; i < Constants.numberOfRows; ++i) { SpreadsheetEngine.AbstractCell cell = _spreadsheet.GetCell(i, 1); // 1 == column B cell.Text = (i + 1).ToString(); // i + 1 because 0-indexing to 1-indexing } // Lastly, set every row in column B to "=B#", where # is actual row number. for (int i = 0; i < Constants.numberOfRows; ++i) { SpreadsheetEngine.AbstractCell cell = _spreadsheet.GetCell(i, 0); // 0 == column A cell.Text = "=B" + (i + 1).ToString(); // i + 1 because 0-indexing to 1-indexing } }
/// <summary> /// Responsible for handling the event 'PropertyChanged', which is fired /// by the AbstractCell class in the backend. Respond by updating the view. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnCellPropertyChanged(object sender, PropertyChangedEventArgs e) { SpreadsheetEngine.AbstractCell backendCell = sender as SpreadsheetEngine.AbstractCell; switch (e.PropertyName) { case "Value": dataGridView1.Rows[backendCell.RowIndex].Cells[backendCell.ColumnIndex].Value = backendCell.Value; // display value if (_spreadsheet.Error) // if error occurred { MessageBox.Show( _spreadsheet.ErrorMessage, "Invalid Formula", MessageBoxButtons.OK ); _spreadsheet.Error = false; _spreadsheet.ErrorMessage = ""; } break; default: break; } }