2016-08-10 2 views
1

У меня есть DataGridView с двумя столбцами, и я хотел создать для него какую-то маска ввода. Поэтому я нашел небольшой класс, который наследует maskedtextbox control и позволяет использовать его в datagridview. Все работает отлично, маска работает по назначению, не имеет большого значения. heres the library: http://www.codeproject.com/Articles/26005/DataGridViewColumn-Hosting-MaskedTextBoxDataGridView Masked TextBox Column

Моя проблема в том, что после того, как строка содержит все данные, которые мне нужны, нажатие enter или tab не создает новую строку, даже если у меня есть datagridview1.AllowUserToAddRows = true. Затем я узнал, что проблема связана с библиотекой, которую я связал, потому что когда я добавляю простой текстовый файл с данными, нажатие enter или tab создает новую строку.

так я добавил эту процедуру, мы надеемся создать новую строку, когда я нахожусь на последнем столбце последней строки:

private void dgOre_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    if(e.RowIndex== dgOre.Rows.Count-1 && e.ColumnIndex== dgOre.Columns.Count - 1){ 
      dgOre.Rows.Add(); 
    } 
} 

проблема с этой процедуры является то, что он добавляет строку, но это создает его ПЕРЕД последней строкой, создавая пробел, как будто я создаю строку до запуска какого-либо другого события. Я должен что-то изменить в библиотеке maskedtextbox или использовать другое событие, но я понятия не имею, как и что редактировать.

Вот исходный код управления для редактирования:

public class DataGridViewMaskedTextEditingControl : MaskedTextBox, 
    IDataGridViewEditingControl 
{ 
    #region Fields 
    private DataGridView dataGridView; 
    private bool valueChanged; 
    private int rowIndex; 
    #endregion 
    #region Constructor 
    public DataGridViewMaskedTextEditingControl() 
    { 
     Mask = String.Empty; 
    } 
    #endregion 
    #region Interface's properties 
    public DataGridView EditingControlDataGridView 
    { 
     get { return dataGridView; } 
     set { dataGridView = value; } 
    } 
    public object EditingControlFormattedValue 
    { 
     get { return Text; } 
     set 
     { 
      if (value is string) 
       Text = (string)value; 
     } 
    } 
    public int EditingControlRowIndex 
    { 
     get { return rowIndex; } 
     set { rowIndex = value; } 
    } 
    public bool EditingControlValueChanged 
    { 
     get { return valueChanged; } 
     set { valueChanged = value; } 
    } 
    public Cursor EditingPanelCursor 
    { 
     get { return base.Cursor; } 
    } 
    public bool RepositionEditingControlOnValueChange 
    { 
     get { return false; } 
    } 

    #endregion 
    #region Interface's methods 
    public void ApplyCellStyleToEditingControl(
     DataGridViewCellStyle dataGridViewCellStyle) 
    { 
     Font = dataGridViewCellStyle.Font; 
     // get the current cell to use the specific mask string 
     DataGridViewMaskedTextCell cell 
      = dataGridView.CurrentCell as DataGridViewMaskedTextCell; 
     if (cell != null) 
     { 
      Mask = cell.Mask; 
     } 
    } 
    public bool EditingControlWantsInputKey(Keys key, bool dataGridViewWantsInputKey) 
    { 
     // Note: In a DataGridView, one could prefer to change the row using 
     // the up/down keys. 
     switch (key & Keys.KeyCode) 
     { 
      case Keys.Left: 
      case Keys.Right: 
      case Keys.Home: 
      case Keys.End: 
       return true; 
      default: 
       return false; 
     } 
    } 
    public object GetEditingControlFormattedValue(DataGridViewDataErrorContexts context) 
    { 
     return EditingControlFormattedValue; 
    } 
    public void PrepareEditingControlForEdit(bool selectAll) 
    { 
     if (selectAll) 
      SelectAll(); 
     else 
     { 
      SelectionStart = 0; 
      SelectionLength = 0; 
     } 
    } 
    #endregion 
    #region MaskedTextBox event 
    protected override void OnTextChanged(System.EventArgs e) 
    { 
     base.OnTextChanged(e); 
     EditingControlValueChanged = true; 
     if (EditingControlDataGridView != null) 
     { 
      EditingControlDataGridView.CurrentCell.Value = Text; 
     } 
    } 
    #endregion 
} 
+0

Основная проблема заключается в 'DataGridViewMaskedTextEditingControl' классе, в' метод OnTextChanged'. –

ответ

1

При внесении изменений в вашем контроле редактирования, вы должны уведомить сетку изменений, используя NotifyCurrentCellDirty(true) сетки. Таким образом, вы можете написать такой код в ваш контроль редактирования:

protected override void OnTextChanged(EventArgs e) 
{ 
    base.OnTextChanged(e); 
    EditingControlValueChanged = true; 
    EditingControlDataGridView.NotifyCurrentCellDirty(true); 
} 
+0

хорошо спасибо. i'lll проверить это завтра, поскольку я не работаю, но это должно быть решением – frankiehf

+0

. Добро пожаловать :) –

+0

Я считаю, что библиотеке нужны еще исправления, например '(string) Value' в' InitializeEditingControl' в ' Класс DataGridViewMaskedTextCell' совершенно неверен. 'Value.ToString()' лучше. Более правильным способом является 'var str = initialFormattedValue как строка;', а затем 'if (str == null) str = string.Empty;' и затем использовать 'editControl.Text = str;' –

Смежные вопросы