我有以下业务对象:
public class MyObject
{
// Some public properties that are bound to text boxes, etc on the form
public string Customer { get; set; }
public int JobNumber { get; set; }
// Each DataTable in this list consists of a single column of doubles
// representing the error in a series of measurements (ex. -.0002, -.0003, .0002, etc)
public List<DataTable> MeasurementErrors {get; set; }
public MyObject
{
// Code in here creates the first DataTable with the first measurement (always zero)
// and adds it to the MeasurementErrors list
errors = new DataTable();
errors.TableName = "MeasurementErrors";
errors.Columns.Add("Error", typeof(double));
errors.Rows.Add(0.0);
MeasurementErrors.Add(errors); // initial table added to the list
}
}
我没有将Customer和JobNumber以及所有其他基本属性绑定到条目表单上的文本框的问题(VS生成了一个BindingSource并为我设置了所有这些控件)。
我遇到的问题是将MeasurementErrors中的一个DataTable绑定到DataGridView控件。要绑定的表应该由NumericUpDown控件选择,然后会有一个简单的“添加”按钮来生成一个新表并将其添加到MeasurementErrors(如果需要,还有一个删除按钮)。如何设置DataGridView的DataSource和DataMember属性以绑定到MeasurementErrors [UpDownControl的值]?
我不是固定使用DataTables,而是从我读过的内容来看,这是绑定到DataGridView的首选方式。
答案 0 :(得分:0)
List<T>
不可绑定。使用IList<T>
代替属性返回类型。
public IList<DataTable> MeasurementErrors { get; set; }
另外,建议最好使用列表成员的内部列表,并根据需要将其设为只读属性。
public class MyObject {
private IList<DataTable> _measurementErrors;
public MyObject() {
_measurementErrors = new List<DataTable>();
}
// This way you make sure to never have a null reference, and don't give
// out the control over your list to the user.
public IList<DataTable> MeasurementErrors {
get {
return _measurementErrors;
}
}
}
编辑#1
IList似乎不是可序列化的,因此它只是从生成的xml文件中删除。是否有一种简单的方法可以使这个IList序列化?
如果您的IList<T>
实例是List<T>
,那么为了序列化,我建议您将IList<T>
输入List<T>
。如果失败,则从其内容创建一个新列表。
var list = myObject1.MeasurementErrors as List<DataTable> ?? new List<DataTable>(myObject1.MeasurementErrors);
有关?? Operator
的详细信息,请参阅MSDN:?? Operator (C# Reference)
简而言之,这是写作的等价:
var list = (myObject1.MeasurementErrors as List<DataTable>) == null ?
new List<DataTable>(myObject1.MeasurementErrors) :
myObject1.MeasurementErrors as List<DataTable>;
或者如果您愿意:
var list = myObject1.MeasurementErrors as List<DataTable>;
if (list == null)
list = new List<DataTable>(myObject1.MeasurementErrors);
我希望这些信息不会比帮助更令人困惑。