C # DataGridView привязан к члену List <DataTable>внутри объекта - PullRequest
0 голосов
/ 19 ноября 2010

У меня есть следующий бизнес-объект:

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 и настроилвсе эти элементы управления для меня).

У меня возникли проблемы с привязкой одной из DataTables в MeasurementErrors к элементу управления DataGridView.Таблица для привязки должна выбираться элементом управления NumericUpDown, а затем будет простая кнопка «Добавить», чтобы сгенерировать новую таблицу и добавить ее в MeasurementErrors (и кнопку удаления, если необходимо).Как настроить свойства DataSource и DataMember DataGridView для привязки к MeasurementErrors [значение UpDownControl]?

Я не зациклен на использовании DataTables, но из того, что я прочитал, это предпочтительный способпривязка к DataGridView.

1 Ответ

0 голосов
/ 19 ноября 2010

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

Надеюсь, эта информация не больше сбивает с толку, чем помогает.

...