我有时使用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
来做这件事,但是如果有另一种方法可以做到这一点......
感谢任何帮助。
答案 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.ImageIndex
和ColumnView.Images
属性手动实施,以在列标题中显示图标。