C#DataGridView绑定到对象</datatable>中的List <datatable>的成员

时间:2010-11-19 16:18:24

标签: c# datagridview bindingsource

我有以下业务对象:

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的首选方式。

1 个答案:

答案 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);

我希望这些信息不会比帮助更令人困惑。