2013-03-14 2 views
1
public enum ENUM_AccDebitCredit 
{ 
    accDR = 1, 
    accCR = 2 
} 

Я заявил об этом в классе, как public ENUM_AccDebitCreditDebitCredit { get; set; }Сохранение нескольких значений для перечисления

В моем коде я попробовал, заполнив эту enum из DataTable следующего

DebitCredit = (ENUM_TransactionType)Enum.Parse(typeof(ENUM_TransactionType), rsACC_AccountingRules.Tables[0].Rows[0]["DR"].ToString()) & (ENUM_TransactionType)Enum.Parse(typeof(ENUM_TransactionType), rsACC_AccountingRules.Tables[0].Rows[0]["CR"].ToString());

Я хотел бы для сохранения нескольких значений в DebitCredit, как я могу это сделать

M у DataTable выглядит следующим образом

DataTable table = new DataTable(); 
table.Columns.Add("Dosage", typeof(int)); 
table.Columns.Add("DR", typeof(string)); 
table.Columns.Add("CR", typeof(string)); 
table.Rows.Add(25, "1","2"); // enum values 
+2

возможно дубликат [Enum Флаги атрибутов] (http://stackoverflow.com/questions/8447/enum-flags-attribute) – CodeCaster

+0

Марк вашего перечисления с атрибутом '[Flags]', если вы хотите, чтобы он вел себя как флаги. Однако вам нужны значения, такие как 1, 2, 4 (если только Return действительно не является как продажами, так и покупками, что, похоже, не представляется возможным) и использовать '|' для их объединения –

+0

Если вы хотите, чтобы DebitCredit был массивом, проверьте http://stackoverflow.com/questions/7031299/array-property-syntax-in-c-sharp – David

ответ

1

Вы могли бы иметь коллекцию ENUM_TransactionType или использовать [Flags] для представления каждого элемента в виде битового флага.

0

Если вы имеете в виду, что вы хотите перечисление «смешивать» больше, чем значение, вы должны изменить свой код:

[Flags] 
public enum ENUM_TransactionType 
{ 
    None = 0, 
    ttSales = 1, 
    ttPurchase = 2, 
    ttReturnIn = 4 
} 

Кроме того, вы должны использовать побитовое ИЛИ | оператор вместо AND &:

ENUM_TransactionType value = ENUM_TransactionType.ttSales | ENUM_TransactionType.ttPurchase; 
+0

Мне нужно назначить значения из datatable, возможно ли это – Dotnet

+0

@Dotnet Конечно. Если столбец данных имеет тип перечисления с атрибутом flags, и вы выполнили все '' 'ORs, нет проблем. –

+0

@ MatíasFidemraizer я бы подумал о том, чтобы сделать свойство нулевым значением вместо 'None'. –

0

что касается самой последней правки, следующий, как вы могли бы сделать это:

public enum ENUM_AccDebitCredit 
{ 
    accDR = 1, 
    accCR = 2 
} 

var type1 = (ENUM_AccDebitCredit)int.Parse(rsACC_AccountingRules.Tables[0].Rows[0]["DR"].ToString()); 

var type2 = (ENUM_AccDebitCredit)int.Parse(rsACC_AccountingRules.Tables[0].Rows[0]["CR"].ToString()); 

myClass.DebitCard = type1 | type2; 

Вы можете использовать атрибут [Flags], или вы можете попробовать что-то вроде этого:

public enum ENUM_TransactionType 
{ 
    ttSales = 1, 
    ttPurchase = 2, 
    ttReturnIn = 4, 
} 

myClass.DebitCard = ENUM_TransactionType.ttSales | ENUM_TransactionType.ttReturnIn; 

bool hasSales = myClass.DebitCard & ENUM_TransactionType.ttSales > 0; 

от А DataTable вы можете попробовать это:

var type1 = (ENUM_TransactionType)Enum.Parse(typeof(ENUM_TransactionType), rsACC_AccountingRules.Tables[0].Rows[0]["Drug"].ToString()); 

var type2 = (ENUM_TransactionType)Enum.Parse(typeof(ENUM_TransactionType), rsACC_AccountingRules.Tables[0].Rows[0]["Drug1"].ToString()); 

myClass.DebitCard = type1 | type2; 

Это процесс называется немного маскирующего. Для получения дополнительной информации о математике, стоящей за этим процессом, см. Здесь: Bit Masking.

+0

Как я могу присвоить 'myclass.DebitCard' из' datatable' – Dotnet

+0

@Dotnet обновленный ответ – rhughes

+0

Привет, спасибо, но вместо 'ttSales и ttPurchase' значение, хранящееся в' myclass.DebitCard', является 'ttReturnIn' – Dotnet

0
var DebitCredit = new List<ENUM_TransactionType>(); 
DebitCredit.Add((ENUM_TransactionType)Enum.Parse(typeof(ENUM_TransactionType), rsACC_AccountingRules.Tables[0].Rows[0]["Drug"].ToString())); 
DebitCredit.Add((ENUM_TransactionType)Enum.Parse(typeof(ENUM_TransactionType), rsACC_AccountingRules.Tables[0].Rows[0]["Drug1"].ToString())); 

Затем вы можете проверить с:

if (DebitCredit.Contains(ENUM_TransactionType.ttSales)) etc. 
Смежные вопросы