Работа с datagridviewrow.databounditem - преобразование в перечислимый объект?

StackOverflow https://stackoverflow.com/questions/4149040

Вопрос

У меня есть 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?

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

Databounditem {customerId = "3133", last_name = "Smith", first_name = "John", accountNumber = "js3133", activeyn = true} <анонимный тип>

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

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

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

Можно ли запросить DataBoundItem с linq?

Редактировать:

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

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

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

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

Это было полезно?

Решение

Вы могли бы передать это как 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 и сможете переименовать / рефакторовать свои свойства без каких-либо проблем.

Другие советы

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

Скажи записей - это список объектов клиентов. Вы должны быть в состоянии пойти:

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

Оба Kevev22 & Adrift имели правильную идею: создайте класс для удержания данных. Поскольку я могу преобразовать IQUERYABLABLE RALVESTETET на 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 - преобразовать IQUERIBALABLE RALVESTETEET на 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top