2014-05-06 22 views
5

winforms. I (şimdiki sorunu için ben de rowvalidation devre dışı bırakılması çalıştı ama yine de aynı sonuçları aldık rağmen) alıyorum giriş doğrulamak için rowvalidation ve cellvalidation bir karışımını kullanıyorum.gösteriliyor cellvalidation hata iletileri İçinde birden sütunlu bir Telerik.WinControls.UI.RadGridView var

Ben (başka bir istisna alırsanız yanlış tarihe bir kullanıcı türleri) bunu doğrulamak için cellvalidating olayını kullanmak hangi bir daterow var. Beklediğim davranış, hata iletisinin görüntülendiği ve hücrenin doğrulanmadığıydı. 2 şey çalıştı, ancak ben hücrenin sınırında üzerine fareyi hareket hata iletisi SADECE görüntülenen alır (başka sadece gösterilmez).

Benim soru ben sürece bir hata doğrulama yoluyla bulunursa gibi hata mesajı en kısa sürede gösterildiğini ulaşmak için yönetmek ve nasıl olurdu?

void MainFormGridView_CellValidating(object sender, CellValidatingEventArgs eventArgs) 
{ 
    var currentCell = eventArgs.Row.Cells[eventArgs.ColumnIndex]; 

    if (eventArgs.Column.Name == "OrderDate") 
    { 
     if (eventArgs.Value == null) 
     { 
      eventArgs.Cancel = true; 
     } 
     else 
     { 
      try 
      { 
       DateTime dateValue; 
       if (!DateTime.TryParse(eventArgs.Value.ToString(), out dateValue)) 
       { 
        eventArgs.Cancel = true; 
       } 
      } 
      catch 
      { 
       // Error occured so validation error! 
       eventArgs.Cancel = true; 
      } 
     } 
     if (eventArgs.Cancel) 
     { 
      currentCell.ErrorText = "Error no valid date! Please type in a valid date"; 
     } 
     else 
     { 
      currentCell.ErrorText = string.Empty; 
     } 
    } 
} 

cevap

0

Araç ipucunu yazdırmayı yönetmek ve fare hücrenin üzerindeyken görünür olmasını sağlamak için birkaç şey yapılması gerekir. Form myForm olarak adlandırılırken, ızgaramın örnek kaynağımda myGrid olarak adlandırıldığını unutmayın.

biz 2 yardımcı değişkenleri tanımlayan yapmanız gereken ilk şey gerekir:

private ToolTip _tooltip; 
private Point _mouse; 

Sonra araç ipucu tanımlamak ve biz

ihtiyaç etkinlik için özel bir işleyici tanımlamak gerekir gerekir
public myForm() 
{ 
    InitializeComponent(); 
    ....//your additional initialization code 

    _tooltip = new ToolTip(); 
    this.myGrid.CellEditorInitialized += myGrid_CellEditorInitialized; 
    this.myGrid.CellValidating+= myGrid_CellValidating; 
} 

hücre doğrulama işlemine ilişkin kod oldukça basittir:

private void myGrid_CellValidating(object sender, CellValidatingEventArgs e) 
{ 
    string errorText = string.Empty; 
    // Are we really on a column currently? 
    if (e.ColumnIndex >= 0) 
    { 
     if (e.Value == null) 
     { 
      errorText = "No field may be empty"; 
     } 
    } 

    // Has an error occured? If so don't let the user out of the field until its corrected! 
    if (errorText != string.Empty) 
    { 
     e.Cancel = true; 
    } 
    e.Row.ErrorText = errorText; 
    e.Row.Cells[e.Column.Name].ErrorText = errorText; 
} 

bu biz yapıldıktan sonra editör ne tür gerçekten

private void myGrid_CellEditorInitialized(objec sender, GridViewCellEventArgs e) 
{ 
       RadTextBoxEditor radTextBoxEditor = e.ActiveEditor as RadTextBoxEditor; 
       RadTextBoxEditorElement editorElement = radTextBoxEditor.EditorElement as RadTextBoxEditorElement; 
       editorElement.AutoToolTip = true; 
       TextBox myTextBox= (TextBox)editorElement.TextBoxItem.HostedControl; 

       myTextBox.MouseMove -= new MouseEventHandler(textBox_MouseMove); 
       myTextBox.MouseLeave -= new EventHandler(textBox_MouseLeave); 
       myTextBox.MouseMove += new MouseEventHandler(textBox_MouseMove); 
       myTextBox.MouseLeave += new EventHandler(textBox_MouseLeave); 
} 

Böylece ilk ne olursa olsun editörü (bir "metin kutusu" olsun: celleditor başlatıldığında, araç ipucu gerektiğinde durumunda hazır olduğundan emin olmak gerekir Orada) ve bu metin kutusu için ihtiyaç duyacağımız olayları belirleyelim, çünkü kullanıcının fare üzerinde ne zaman olduğunu bilmemiz gerekir.

void textBox_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (mousePos != e.Location) 
    { 
     RadTextBoxEditor radTextBoxEditor = this.myGrid.ActiveEditor as RadTextBoxEditor; 
     GridDataCellElement gridCellElement = radTextBoxEditor.OwnerElement as GridDataCellElement; 
     if (gridCellElement != null && gridCellElement.ContainsErrors) 
     { 
      RadTextBoxEditorElement radTextBoxEditorElement = radTextBoxEditor.EditorElement as RadTextBoxEditorElement; 
      TextBox myTextBox = (TextBox)radTextBoxEditorElement.TextBoxItem.HostedControl; 
      _tooltip.Show(gridCellElement.RowInfo.Cells[gridCellElement.ColumnInfo.Name].ErrorText, myTextBox, new Point(e.Location.X + 8, e.Location.Y + 8)); 
      _mouse = e.Location; 
     } 
    } 
} 

biz de ipucu yine mouseLeave olay ile ilgisi olan kaybolması gerekir Bundan sonra: ipucu gösterilecektir ZAMAN

sonraki adım böylece mousemove fonksiyonunu tanımlamaktır

bu adımlar kullanım hücreye fare hareket ve o hücreyi terk ettiğinde tekrar kaybolduğunda görünen bir araç ipucu var ile bitmiş
void textBox_MouseLeave(object sender, EventArgs e) 
     { 
      RadTextBoxEditor radTextBoxEditor = this.myGrid.ActiveEditor as RadTextBoxEditor; 
      RadTextBoxEditorElement radTextBoxEditorElement = radTextBoxEditor.EditorElement as RadTextBoxEditorElement; 
      TextBox myTextBox = (TextBox)radTextBoxEditorElement.TextBoxItem.HostedControl; 
      Rectangle textBoxBounds = new Rectangle(myTextBox.PointToScreen(Point.Empty), myTextBox.Size); 
      if (!textBoxBounds.Contains(Control.MousePosition)) 
      { 
       _tooltip.Hide(textBox); 
      } 
     } 

.

2

hücrenin üzerinde size fareyi tetiklendiğinde bir olay bulun ve doğrulama hataları varsa kodunuzdan ateşlendiğinde: Burada

kullandığım cellvalidation kodudur. En zarif çözüm henüz işe yaramaz.

+0

Önceki yorumumu bir noktada yaptığınız gibi "mouseover" (veya daha fazla mousemove) olayını kullanarak doğru bir çözüm olduğunu, ancak tek bir parçası olmasa da olası bir çözümün parçası. – Thomas

1

Telerik WPF RadGridView kontrollerini kullanıyorum, ama yine de pencere ad var, bu deneyin.

/// <summary> 
/// RadGridView cell validating. 
/// </summary> 
/// <param name="e"> 
/// The e. 
/// </param> 
private void CellValidating(GridViewCellValidatingEventArgs e) 
{ 
    bool isValid = true; 
    string validationText = "Validation failed. "; 
    GridViewCell cell = e.Cell; 
    switch (cell.Column.UniqueName) 
    { 
    case "Code": 
    case "Name": 
    case "County": 
    case "Region": 
     isValid = e.NewValue != null && !string.IsNullOrWhiteSpace(e.NewValue.ToString()); 
     if (!isValid) 
     { 
     validationText += string.Format("{0} is required.", cell.Column.UniqueName); 
     } 

     break; 

     /* Continue case statements... */ 

    } 

    if (!isValid) 
    { 
    MarkCell(cell, validationText); 
    } 
    else 
    { 
    RestoreCell(cell); 
    } 

    e.ErrorMessage = validationText; 
    e.IsValid = isValid; 
} 

/// <summary> 
/// Marks the cell with a red box and tooltip of the validation text. 
/// </summary> 
/// <param name="cell"> 
/// The cell. 
/// </param> 
/// <param name="validationText"> 
/// The validation text. 
/// </param> 
private void MarkCell(Control cell, string validationText) 
{ 
    ToolTipService.SetToolTip(cell, validationText); 
} 

/// <summary> 
/// Restores the cell and removes the tooltip. 
/// </summary> 
/// <param name="cell"> 
/// The cell. 
/// </param> 
private void RestoreCell(Control cell) 
{ 
    ToolTipService.SetToolTip(cell, null); 
} 
+0

Winformlarda bu kadar kolay olsaydı hoşuna giderdi diyebilirim. Sadece telerik desteği ile bir konuşma yaptı (hala bana gönderdikleri kodu analiz ediyor), ama wpf'in orada winform'lar üzerinde çok büyük bir basitlik avantajı var gibi görünüyor. Winformlarda, hücre etkinleştirme olayına ek olarak 5 olayı kişiselleştirmem gerekiyor. Ne zaman ve neden yaptıklarını tam olarak anladığımdan emin olduğum sürece bir yazıyı koyacağım. – Thomas

İlgili konular