#linq #anonymous-types
#linq #анонимные типы
Вопрос:
Я использую следующий код для получения записи из таблицы моей базы данных tblDatabases
. Затем я заполняю элементы управления в форме на основе значения. Я использовал некоторые функции, чтобы получить значения, необходимые для отображения в текстовом поле (например, отображаемое значение отличается от значения.
DetailData
— это объект в моем базовом классе form. Изначально я просто получил запись из таблицы как есть, и я смог привести DetailData
к tblDatabases
и использовать отражение, чтобы получить все значения для данных и заполнить элементы управления в моей форме.
Я больше не могу привести DetailData
к моей таблице из-за анонимных типов.
Я хотел бы иметь возможность использовать отражение DetailData
для получения значений.
Спасибо, Брэд
DetailData = (from db in priorityDataContext.tblDatabases
where db.DatabaseID == Id
select new
{
db.DatabaseID,
db.DatabaseName,
db.Purpose,
db.BackEnd,
db.FrontEnd,
db.Version,
db.ProducesReports,
db.MultiUser,
db.UserDescription,
Developer = priorityDataContext.func_get_employee_name(db.Developer),
DeptOwner = priorityDataContext.func_get_dept_name(db.DeptOwner),
db.Source_Code_Path,
db.Notes,
db.Active,
db.row_entry_time_stamp,
row_oper_name = priorityDataContext.func_get_employee_name(db.Developer),
db.row_last_chng_time_stamp,
row_last_chng_oper_name = priorityDataContext.func_get_employee_name(db.Developer)
}).SingleOrDefault();
protected virtual void PopulateDetailControlsA(List<Control> controlContainers, string srcDataTableName)
{
switch (srcDataTableName)
{
case "tblDatabase" :
break;
}
var database = (tblDatabase) DetailData;
var type = typeof(tblDatabase);
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var controlContainer in controlContainers)
{
foreach (var propertyInfo in properties)
{
if (!ControlExists(controlContainer, propertyInfo.Name)) continue;
var txtExtControl = controlContainer.Controls[propertyInfo.Name] as ExtendedTextBox;
if (txtExtControl != null)
{
try
{
var value = propertyInfo.GetValue(database, null).ToString();
txtExtControl.Text = value;
}
catch (NullReferenceException)
{
}
continue;
}
var lnklblControl = controlContainer.Controls[propertyInfo.Name] as ExtendedLinkLabel;
if (lnklblControl != null)
{
try
{
var value = propertyInfo.GetValue(database, null).ToString();
lnklblControl.Text = value;
}
catch (NullReferenceException)
{
}
continue;
}
var chkControl = controlContainer.Controls[propertyInfo.Name] as ExtendedCheckBox;
if (chkControl != null)
{
try
{
var value = propertyInfo.GetValue(database, null).ToString();
switch (value)
{
case "True":
chkControl.CheckState = CheckState.Checked;
break;
case "False":
chkControl.CheckState = CheckState.Unchecked;
break;
}
}
catch (NullReferenceException)
{
chkControl.CheckState = CheckState.Indeterminate;
}
continue;
}
var cmbControl = controlContainer.Controls[propertyInfo.Name] as ExtendedComboBox;
if (cmbControl != null)
{
try
{
var value = propertyInfo.GetValue(database, null).ToString();
cmbControl.ValueMember = value;
}
catch (Exception ex)
{
}
continue;
}
}
}
}
Комментарии:
1. Было бы полезно, если бы вы могли опубликовать минимальное количество кода, необходимое для воспроизведения вашей проблемы. Прямо сейчас довольно сложно понять, что происходит.
Ответ №1:
Какую технологию вы используете для своего пользовательского интерфейса? Если бы вы могли использовать привязку, вам не нужно было бы беспокоиться об отражении анонимного типа, а затем вы также могли бы использовать конвертеры, если вам нужно отформатировать / вычислить значения из этого.
Из вашего ответа следует, что вы не можете просто использовать подключение к linq, а затем привязать это к полю со списком?
private void Form1_Load(object sender, System.EventArgs e)
{
var item = new DataClassesDataContext();
var stuff = item.Entity.Where(c => c.Property.Contains("something"));
comboBox1.DataSource = stuff;
comboBox1.DisplayMember = "Name";
comboBox1.ValueMember = "PIN";
}
Комментарии:
1. Это существующее приложение Winforms. Я пытался отключить команды sql и использовать linq. Мы отображаем такие вещи, как имя оператора, на основе PIN-кода пользователя. Итак, в настоящее время инструкция sql включает функцию, которая получает имя пользователя из PIN-кода. Таким образом, элементом значения поля со списком является PIN-код пользователя, а отображаемым значением — имя пользователя.