2014-05-06 7 views
5

के तहत सेलविलिडेशन त्रुटि संदेशों को प्रदर्शित करना मुझे इसमें कई कॉलम के साथ एक Telerik.WinControls.UI.RadGridView मिला है। मैं जो इनपुट प्राप्त करता हूं उसे सत्यापित करने के लिए मैं पंक्तिबद्धता और सेलविलिडेशन का मिश्रण उपयोग कर रहा हूं (हालांकि वर्तमान समस्या के लिए मैंने पंक्तिवृद्धि को निष्क्रिय करने का भी प्रयास किया लेकिन फिर भी वही परिणाम प्राप्त हुए)।टेलरिक विनफॉर्म

मेरे पास एक डैटरो है जिसके लिए मैं इसे सत्यापित करने के लिए सेलवालिडेटिंग ईवेंट का उपयोग करता हूं (अन्यथा यदि कोई उपयोगकर्ता गलत तिथि में टाइप करता है तो मुझे अपवाद मिलता है)। मुझे अपेक्षित व्यवहार यह था कि त्रुटि संदेश प्रदर्शित होता है और सेल मान्य नहीं होता है। दूसरी बात काम करती है, लेकिन त्रुटि संदेश केवल तब प्रदर्शित होता है जब मैं माउस को सेल की सीमा पर ले जाता हूं (अन्यथा यह दिखाया नहीं गया है)।

तो मेरा प्रश्न यह होगा कि मैं यह कैसे प्राप्त कर सकता हूं कि त्रुटि संदेश जल्द ही दिखाया गया है और जब तक सत्यापन के माध्यम से कोई त्रुटि नहीं मिलती है?

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; 
     } 
    } 
} 

उत्तर

0

आदेश टूलटिप प्रिंट और जबकि माउस सेल कुछ चीजें किया जा करने की जरूरत है खत्म हो गया है यह दृश्यमान करना प्रबंधन करने के लिए। ध्यान रखें कि मेरे ग्रिड को उदाहरण स्रोत में MyGrid कहा जाता है जबकि फ़ॉर्म को मेराफॉर्म कहा जाता है।

पहली बात यह है कि हम ऐसा करने के लिए 2 सहायक चर को परिभाषित करने की जरूरत है हम की जरूरत है:

private ToolTip _tooltip; 
private Point _mouse; 

फिर हम टूलटिप को परिभाषित, और घटना हम

की जरूरत के लिए एक कस्टम हैंडलर परिभाषित करने की जरूरत की जरूरत है इसके बाद हम किया जाता है

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; 
} 

:

public myForm() 
{ 
    InitializeComponent(); 
    ....//your additional initialization code 

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

सेल सत्यापित करने के लिए कोड काफी सरल है

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); 
} 

इस प्रकार पहली हम संपादक (के "पाठ बॉक्स" परवाह किए बिना प्राप्त संपादक किस प्रकार वास्तव में है: यह है कि जब celleditor आरंभ नहीं हो जाता, कि टूलटिप मामले में तैयार किया जाता है यह आवश्यक है सुनिश्चित करने की आवश्यकता वहां) और इस टेक्स्टबॉक्स के लिए हमें आवश्यक घटनाएं सेट करें, क्योंकि हम जानना चाहते हैं कि उपयोगकर्ता के पास टेक्स्टबॉक्स पर माउस कब होता है, और जब नहीं।

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; 
     } 
    } 
} 

इस हम भी टूलटिप फिर जो हम mouseleave घटना से कोई लेना गायब होने देना होता है के बाद: जब टूलटिप प्रदर्शित किया जाएगा

अगले कदम, MouseMove समारोह को परिभाषित करने के लिए है इस प्रकार

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

एक घटना है कि जब आप सेल पर माउस ट्रिगर किया जाता है का पता लगाएं और अपने कोड से यह आग अगर वहाँ सत्यापन त्रुटियों हैं:

यहाँ मैं का उपयोग cellvalidation कोड है। सबसे सुरुचिपूर्ण समाधान अभी तक काम नहीं करना चाहिए।

+0

मैंने अपनी पूर्व टिप्पणी को एक बिंदु में हटा दिया है, क्योंकि आप "माउसओवर" (या अधिक मूसोमोव) ईवेंट का उपयोग कर सही समाधान का उपयोग कर रहे हैं, हालांकि अभी तक एकमात्र हिस्सा नहीं है। – Thomas

1

मैं टेलीरिक WPF RadGridView नियंत्रणों का उपयोग कर रहा हूं, फिर भी यह अभी भी विंडोज नेमस्पेस है, इसे आज़माएं।

/// <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

मुझे कहना है कि अगर मैं Winforms में इतना आसान था तो मुझे यह पसंद आया होगा। टेलरिक समर्थन के साथ बस एक बात थी (अभी भी उन्होंने मुझे भेजे गए कोड का विश्लेषण किया), लेकिन ऐसा लगता है कि wpf के पास Winforms पर एक विशाल सादगी लाभ है। Winforms में मुझे सेलविडिएशन घटना के अलावा 5 घटनाओं को अनुकूलित करने की आवश्यकता है। जैसे ही मुझे यकीन है कि मैं वहां एक पोस्ट डालूंगा, मैं पूरी तरह से समझता हूं कि उन्होंने क्या किया और क्यों। – Thomas

संबंधित मुद्दे