Как построить тип, чтобы содержать два типа данных, которые будут отправлены в виде одного параметра
Мне нужно реализовать этот подход - два вида данных, отправленных как один набор параметров... в единый Type
- так что один тип будет содержать эти два параметра.
тогда я мог бы передать это Type
обрабатываться каким-либо методом.
первый элемент данных:
Столбцы для отображения с именем: displayed
второй элемент данных:... ну, на самом деле это копия... или только часть этих столбцов displayed
,
поскольку он имеет тот же источник, только эти столбцы не будут отображаться.
Столбцы опустить, поэтому я назвал это: omitted
оба типа столбцов, которые я назвал - SelectedColumns
public class SelectedcColoumns
{
public enum renederingMode
{
Displayed,
omitted
}
public class omitted
{
}
public class displayed
{
}
}
Поскольку запрос на отображение этого SetOfColumns выполняется путем выбора имени таблицы. Таким образом, класс Column в качестве данных, которые будут отображаться, изменяется (естественно), основываясь на выборе пользователем доступного источника для SelectedColoumns
на выбор, как показано ниже:
public class tableNames
{
public static readonly string tblCustomers = "tblCustomers";
public static readonly string tblProducts = "tblProducts";
}
public class TblColumns
{
public class tblCustomers
{
public const string custID = "custID",
Name = "Name",
Phone = "Phone";
Email = "Email";
}
public class tblProducts
{
public const string PrudctID = "PrudctID ",
PrudctName = "PrudctID",
PrudctCategory = "PrudctCategory";
}
...etc'
}
рассматриваемый сценарий
когда пользователь выбирает набор таблиц-столбцов... из любой таблицы пользователь может, в этом примере.. выбрать либо Customers
или же Products
колонны говорят... SelectedColumns
- является tblCustomers
Столбцы, мне тогда нужно иметь другой список, из тех, которые пользователь выбрал, чтобы пропустить (не отображать) из всех доступных столбцов таблицы.
Скажите, что пользователь выбрал Table Customers в качестве таблицы, которую он решил опустить tblCustomers.custID
+ tblCustomer.Email
потому что ему нужно только имя и телефон для отображения
текущая цель
проблема, с которой я столкнулся, заключается в том, что при наличии этих параметров в моей досягаемости - (имя таблицы + столбцы пропустить). Как я могу отправить его для обработки (передавая его как один параметр), поэтому я создал выделенный класс, чтобы держи это Type
как отправленный параметр: all columns
+ omitted Columns
одним куском.
но это то, что я начал пытаться... и я в настоящее время застрял!
Мне нужно знать, как использовать его для построения / конструирования параметра из выбора пользователя. Я буду очень признателен за вашу помощь.
public class SelectedColoumns
{
public enum renederingMode
{
Displayed,
omitted
}
public class omitted
{
List<string> omitCols_ListStr = new List<string>();
}
public class displayed
{
List<string> dispCols_ListStr = new List<string>();
}
}
Что касается горячего, то получить исходную часть легко (относительно для меня), так что нет необходимости в помощи по этому аспекту, я просто добавляю ее в качестве дополнительной информации.
в этой части я получаю список столбцов через reflection
- как поставщик данных, используя следующий метод:
получить любые вложенные поля классов, как List<string>
, Вложенным class-name
и это родитель - Type
,
public static List<string> anyNestedClassFiledsAsListByType<ClassToReturnOneOfitsNested_Fields>(string NetedClassName)
{
var RetNestedClassFildsListValues = typeof(ClassToReturnOneOFitsNested).GetNestedTypes()
.First(t => String.Compare(t.Name, NetedClassName, true) == 0).GetFields(BindingFlags.Public | BindingFlags.Static)
.Where(f => f.FieldType == typeof(string)).Select(f => (string)f.GetValue(null)).ToList();
return RetNestedClassFildsListValues;
}
так, чтобы произвести это, я мог бы использовать метод выше, как это
var TableColumns_ALL =
anyNestedClassFldsAsListByType<TblColumns>(tableNames.tblCustomers);
Мой вопрос связан с классом, который должен отправить TableColumns_ALL + выбранные столбцы, чтобы пропустить их затем будет обработано renderSelectedTable()
ниже.
так что это даже более простой, чем сложность рефлексии... но все же кое-что, как я не знаю, как создать поппер, SelectedColumns class
, таким образом, он будет приспосабливать и форматировать структуру этого нового типа данных, который будет отправлен как параметр, который метод отправляет следующим образом.
public void renderSelectedTable(SelectedColoumns CurrentUserSelectedCols)
{
StringBuilder NwTRLoopSB = new StringBuilder();
string curRowStyle= string.Empty,
nwLine = Environment.NewLine + "\t\t\t",
BaseTemplateTD = string.Empty;
NwTRLoopSB.Append(
string.Format(
"<table id='tbl_Settings' cellspacing='0' border='1'><tr id='TR_headers'{0}>{1}",
curRowStyle,
nwLine
)._Dhtml_DoubleQoutes()
);
foreach (var Item in SelectedListStr.Select((Val, counter) => new { Value = Val, Index = counter }))
{
curRowStyle = Lsts.DynamicStyle_Generator(Item.Index);
if(Lsts.ExcludeColumns(Item.Value, OmittedCols))
{
BaseTemplateTD = string.Format("<td>{0}</td>{1}", Item.Value, nwLine)._Dhtml_DoubleQoutes();
NwTRLoopSB.Append(BaseTemplateTD);
}
}///ENd TR cells generator Section
NwTRLoopSB.Append("</tr></table>");
return NwTRLoopSB.ToString();
}
Спасибо за вашу помощь
2 ответа
Я бы подошел к этому так:
public class Column{
public string Name { get; set; }
public bool Visible { get; set; }
}
public class Grid{
public List<Column> Columns { get; set; }
}
Таким образом, я мог легко определить свою полную таблицу с видимыми или опущенными столбцами. В примере ОП:
public class SelectedColumns
{
//instead of the enum you would have boolean in the column type "Visible" (whether is shown or not)
public enum renederingMode
{
Displayed,
omitted
}
// instead of both these you would have a List o Column types that have a name AND a boolean, so you have your List<string> and a boolean to indicate whether it is visible or ommited. Well at least that's how I understood it.
public class ommited
{
}
public class displayed
{
}
}
Так что... сначала... примечание к дизайну: учитывая список столбцов... вы либо отобразите столбец, либо не отобразите столбец... других вариантов, касающихся видимости, нет. Таким образом, вам действительно нужно передать только один список ИЛИ столбцов для отображения, ИЛИ столбцов, чтобы пропустить - но НЕ оба.
Если вы решите сделать это изменение, то вы можете просто передать один List<string>
Если вы решите сохранить свой текущий дизайн, то вам понадобится класс с двумя properties
:
public class SelectedColumns {
public List<string> displayed { get; set; }
public List<string> omitted { get; set; }
}