internal override bool Perform()
        {
            DataGridViewRow changedRow = _dgvVariables.Rows[_eventArgs.RowIndex];

            VarConfig.VariableRow variableRow = changedRow.Tag as VarConfig.VariableRow;

            if (_eventArgs.ColumnIndex == _dgvVariables.Columns.IndexOf(_variablesForm.colVariableName))
            {     //variables name edited
                if (variableRow.Name != changedRow.Cells[_eventArgs.ColumnIndex].Value.ToString())
                { //only (change and) return true if actually changed
                    variableRow.Name = changedRow.Cells[_eventArgs.ColumnIndex].Value.ToString();
                    int columnIndexAutoLabel = _variablesForm.dgvVariables.Columns.IndexOf(_variablesForm.colAutomaticLabel);
                    variableRow.AutoLabel = changedRow.Cells[columnIndexAutoLabel].Value.ToString();
                    return(true);
                }
            }

            if (_eventArgs.ColumnIndex == _dgvVariables.Columns.IndexOf(_variablesForm.colMonetary))
            {//checkbox monetary edited
                bool newValue_IsMonetary = (bool)changedRow.Cells[_eventArgs.ColumnIndex].Value;
                if (VariablesManager.IsMonetary(variableRow) && !newValue_IsMonetary)
                {//current value monetary, new value non-monetary
                    variableRow.Monetary = "0";
                    return(true);
                }
                if (!VariablesManager.IsMonetary(variableRow) && newValue_IsMonetary)
                {//current value non-monetary, new value monetary
                    variableRow.Monetary = "1";
                    return(true);
                }
            }

            if (_eventArgs.ColumnIndex == _dgvVariables.Columns.IndexOf(_variablesForm.colHHLevel))
            {//checkbox HH Level edited
                bool newValue_IsHHLevel = (bool)changedRow.Cells[_eventArgs.ColumnIndex].Value;
                if (VariablesManager.IsHHLevel(variableRow) && !newValue_IsHHLevel)
                {//current value hh-level, new value ind-level
                    variableRow.HHLevel = "0";
                    return(true);
                }
                if (!VariablesManager.IsHHLevel(variableRow) && newValue_IsHHLevel)
                {//current value ind-level, new value hh-level
                    variableRow.HHLevel = "1";
                    return(true);
                }
            }

            return(false);
        }
        internal override bool Perform()
        {
            VarConfig.VariableRow variableRow = _varConfigFacade.AddVariable();

            int index = 0;

            if (_dgvVariables.SelectedRows.Count == 1)
            {
                index = _dgvVariables.Rows.IndexOf(_dgvVariables.SelectedRows[0]) + 1;
            }
            _dgvVariables.Rows.Insert(index, variableRow.Name, VariablesManager.IsMonetary(variableRow),
                                      VariablesManager.IsHHLevel(variableRow), false, variableRow.AutoLabel);
            _dgvVariables.Rows[index].Tag = variableRow;
            _dgvVariables.Rows[index].Cells[0].Selected = true; //set input focus to just added row (selecting row instead of cell does not work)
            _dgvVariables.Select();                             //grid view must be selected too, otherwise another list may have the input focus
            return(true);
        }