Работа с DataGridViewRow.DataBoundItem - преобразовать в перечисляемый объект? - PullRequest
2 голосов
/ 11 ноября 2010

У меня есть DataGridView с

myGridView.DataSource = GetSomeData()


// method called
public IQueryable GetSomeData()
{
    var source = from r in records
                 select r;

    return source;    // made correction from 'r' to 'source'
}

GetSomeData() заполняет DataGridView, как и ожидалось. Пользователь выберет строку для редактирования, которая затем передает данные строки в форму. Поскольку DataGridViewRow.DataBoundItem является анонимным типом, как я могу передать DataBoundItem?

Я почти ожидал, что мой DataBoundItem будет IQueryable - неверно. Вот информация отладчика о свойстве DataBoundItem:

DataBoundItem {CustomerID = "3133", Last_Name = "Смит", First_Name = "Джон", AccountNumber = "JS3133", ActiveYN = True} <анонимный тип>

Как только данные передаются в новую форму, я хотел бы сделать что-то вроде:

txtFName.Text = SomeEnumeratedObject["First_Name"];
txtLName.Text = SomeEnumeratedObject["Last_Name"];

Есть идеи, как мне это сделать? ИМО было бы еще лучше, если бы элементы управления в новой форме могли каким-то образом быть связаны с SomeEnumeratedObject.

Можно ли запросить DataBoundItem с помощью LINQ?

Edit:

Изменен метод:

public DataView GetSomeData()
{
    var source = from r in records
                 select r;

    DataTable table = ToDataTable(myContext, source);
    return new DataView(table);
}

См. Полное решение здесь .

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

Вы можете передать его как dynamic и получить доступ к свойствам следующим образом:

public void Test(dynamic item)
{
    MessageBox.Show(string.Format("{0} : {1}", item.First_Name, item.Last_Name));
    textBox1.DataBindings.Add("Text", _item, "First_Name");
    textBox2.DataBindings.Add("Text", _item, "Last_Name");
}

Следует учитывать, что свойства анонимных типов доступны только для чтения, поэтому ваш пользователь не сможет редактироватьценности таким образом.Из спецификации языка C #:

Члены анонимного типа представляют собой последовательность свойств, доступных только для чтения, выведенных из инициализатора анонимного объекта, используемого для создания экземпляра типа.

Вы должны рассмотреть возможность объявления типа для этого вместо использования анонимного типа.Таким образом, вы также получите преимущество от intellisense и сможете без проблем переименовывать / реорганизовывать свои свойства.

1 голос
/ 11 ноября 2010

Какие объекты находятся в записях?Вы должны иметь возможность привести DataGridViewRow.DataBoundItem к любому типу записей объектов.

Say records - список объектов Customer.Вы должны быть в состоянии пойти:

txtFName.Text = ((Customer)DataGridViewRow.DataBoundItem).First_Name;
txtLName.Text = ((Customer)DataGridViewRow.DataBoundItem).Last_Name; 

Если это невозможно, то я думаю, вам придется использовать отражение:

Type type = DataGridViewRow.DataBoundItem.GetType();  
String firstName = (String)type.GetProperty("First_Name")
                        .GetValue(DataGridViewRow.DataBoundItem, null);
0 голосов
/ 11 ноября 2010

У kevev22 и adrift была правильная идея: создать класс для хранения данных.Поскольку я могу преобразовать набор результатов IQueryable в DataTable, это имеет смысл только сделать так:

public DataView GetSomeData()
{
    var source = from r in records
                 select r;

    DataTable table = ToDataTable(myContext, source);
    return new DataView(table);
}

Сейчас:

myDGView.DataSource = GetSomeData();

И когда выбрана строка сетки данных, выприведите DataBoundItem к DataRow.

FYI - чтобы преобразовать набор результатов IQueryable в DataTable:

public DataTable ToDataTable(DataContext context, IQueryable source)
{
    DataTable table = new DataTable();
    {
        adapter.SelectCommand = context.GetCommand(source);
        sqlCommand.Connection.Open();
        adapter.FillSchema(table, SchemaType.Source);
        adapter.Fill(table);
    }

    return table;
}
...