同时在各行中设置SetColumnError

时间:2014-03-19 16:18:25

标签: c# devexpress multiple-columns

我有时使用SetColumnError方法,根据我的经验,我知道当行失去焦点时,图标会消失。

我现在想要的是在不同行中的各个单元格中同时显示相同的错误图标。像这样:

for (int i = 0; i < view.RowCount; i++)
{ 
    /* Move the focus for setting the error  */
    view.FocusedRowHandle = i;

    if (condition)
    {
        view.SetColumnError(view.Columns["NameOfColumn"],
                                         "Message", ErrorType.Critical);            
    }
}

我尝试了类似的东西,但没有工作,我唯一的成就是焦点的最后一行显示指定单元格中的错误图标。我想用SetColumnError来做这件事,但是如果有另一种方法可以做到这一点......

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

问题是Grid本身无法存储错误,这就是为什么只维护FocusedRow的图标错误,但是您可以实现某些interface并存储所有错误每行的错误。

interface的名称是IDataErrorInfo,它提供了提供用户界面可以绑定的自定义错误信息的功能。

以下是使用此界面的示例:

public class MyModel : IDataErrorInfo
{
    /// <summary>
    /// Stores error descriptions for the properties.
    /// </summary>
    Hashtable propertyErrors;

    /// <summary>
    /// Stores an error description for the item.
    /// </summary>
    String fNoteError;

   /// <summary>
   /// Gets and sets an error for the current item
   /// </summary>
   internal string NoteError
   {
       get { return fNoteError; }
       set
       {
           if (fNoteError != null && fNoteError == value) return;
           fNoteError = value;
       }
    }

    //Returns an error description set for the item's property
    string IDataErrorInfo.this[string columnName]
    {
        get
        {
           return GetColumnError(columnName);
        }
    }

    //Returns an error description set for the current item
    string IDataErrorInfo.Error
    {
        get { return NoteError; }
    }   

    public String NameOfColumnA { get; set; }
    public String NameOfColumnB { get; set; }

    public MyModel()
    {
       propertyErrors = new Hashtable { { "NameOfColumnA", "" }, { "NameOfColumnB", "" }};
       fNoteError = "";
    }     

    //Sets an error for an item's property
    public void SetColumnError(string elem, string error)
    {
        if (propertyErrors.ContainsKey(elem))
        {
            if ((string)propertyErrors[elem] == error) return;
            propertyErrors[elem] = error;
        }
    }

    //Gets an error for an item's property
    public string GetColumnError(string elem)
    {
       if (propertyErrors.ContainsKey(elem))
          return (string)propertyErrors[elem];
       else
          return "";
    }

    public void ClearErrors()
    {
       SetColumnError("NameOfColumnA", "");
       SetColumnError("NameOfColumnB", "");           
       NoteError = "";
    }
}

上面的代码为Grid定义了一个模型,其中包含两列可能包含错误的列。然后在你UserControl课程中,你必须这样做:

public partial class UsDesiredName : UserControl3
{
    //Some code for your class

    private void ValidateData()
    {
        var data = gc_view.DataSource as List<MyModel>;
        foreach (var item in data)
        {                
            item.ClearErrors();
            if (condition for columnA)
            {
                item.NoteError = "Required fields.";
                item.SetColumnError("NameOfColumnA", "Required field.");                                       
            }  

            if (condition for columnB)
            {
                item.NoteError = "Required fields.";                    
                item.SetColumnError("NameOfColumnB", "Required field.");                    
            }    
        }
    }

    private void gc_view_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
    {
        ValidateData()
    }
}

我希望这对某些人有用,就像对我一样。

答案 1 :(得分:0)

我担心GridView.SetColumnError()只能用于焦点行。

要满足您的要求,您必须使用GridColumn.ImageIndexColumnView.Images属性手动实施,以在列标题中显示图标。