উত্তর:
আমি সম্ভবত ডেটাটিকে একটি এনাম হিসাবে আবদ্ধ করব না এবং এটি সংকলনের সময় পরে পরিবর্তন হবে না (যদি না আমি এই স্টোপিড মুহুর্তগুলির মধ্যে একটি থাকি )।
এনামের মাধ্যমে পুনরাবৃত্তি করা আরও ভাল:
Dim itemValues As Array = System.Enum.GetValues(GetType(Response))
Dim itemNames As Array = System.Enum.GetNames(GetType(Response))
For i As Integer = 0 To itemNames.Length - 1
Dim item As New ListItem(itemNames(i), itemValues(i))
dropdownlist.Items.Add(item)
Next
বা সি # তে একই
Array itemValues = System.Enum.GetValues(typeof(Response));
Array itemNames = System.Enum.GetNames(typeof(Response));
for (int i = 0; i <= itemNames.Length - 1 ; i++) {
ListItem item = new ListItem(itemNames[i], itemValues[i]);
dropdownlist.Items.Add(item);
}
একটি গণনা থেকে একটি (এনাম মান এবং নামের জুটি) Enumerationপেতে নিম্নলিখিত ইউটিলিটি ক্লাসটি ব্যবহার করুন ; তারপরে আপনি আইডিকেয়ারটিকে একটি বাইন্ডেবল নিয়ন্ত্রণে আবদ্ধ করুন ।IDictionary<int,string>
public static class Enumeration
{
public static IDictionary<int, string> GetAll<TEnum>() where TEnum: struct
{
var enumerationType = typeof (TEnum);
if (!enumerationType.IsEnum)
throw new ArgumentException("Enumeration type is expected.");
var dictionary = new Dictionary<int, string>();
foreach (int value in Enum.GetValues(enumerationType))
{
var name = Enum.GetName(enumerationType, value);
dictionary.Add(value, name);
}
return dictionary;
}
}
উদাহরণ: গণনার ডেটা নিয়ন্ত্রণে বাঁধতে ইউটিলিটি ক্লাস ব্যবহার করা
ddlResponse.DataSource = Enumeration.GetAll<Response>();
ddlResponse.DataTextField = "Value";
ddlResponse.DataValueField = "Key";
ddlResponse.DataBind();
আমার সংস্করণটি উপরেরগুলির একটি সংকীর্ণ রূপ:
foreach (Response r in Enum.GetValues(typeof(Response)))
{
ListItem item = new ListItem(Enum.GetName(typeof(Response), r), r.ToString());
DropDownList1.Items.Add(item);
}
public enum Color
{
RED,
GREEN,
BLUE
}
প্রতিটি এনুম টাইপ সিস্টেম.ইনুম থেকে প্রাপ্ত। দুটি স্থিতিশীল পদ্ধতি রয়েছে যা একটি ড্রপ-ডাউন তালিকা নিয়ন্ত্রণে ডেটা বাঁধতে সহায়তা করে (এবং মানটি পুনরুদ্ধার করে)। এগুলি হ'ল এনাম.গেটনাম এবং এনাম P পার্স। গেটনাম ব্যবহার করে, আপনি নিম্নলিখিতভাবে আপনার ড্রপ-ডাউন তালিকার নিয়ন্ত্রণে বাঁধতে সক্ষম হন:
protected System.Web.UI.WebControls.DropDownList ddColor;
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack)
{
ddColor.DataSource = Enum.GetNames(typeof(Color));
ddColor.DataBind();
}
}
এখন আপনি যদি এনাম মানটি বাছাইয়ে ফিরে চান ...
private void ddColor_SelectedIndexChanged(object sender, System.EventArgs e)
{
Color selectedColor = (Color)Enum.Parse(typeof(Color),ddColor.SelectedValue
}
সমস্ত পোস্ট পড়ার পরে আমি ড্রপডাউন তালিকায় এনাম বিবরণ প্রদর্শন করার পাশাপাশি সম্পাদনা মোডে প্রদর্শন করার সময় ড্রপডাউনতে মডেল থেকে যথাযথ মান নির্বাচন করার পক্ষে একটি ব্যাপক সমাধান নিয়ে এসেছি:
enum:
using System.ComponentModel;
public enum CompanyType
{
[Description("")]
Null = 1,
[Description("Supplier")]
Supplier = 2,
[Description("Customer")]
Customer = 3
}
এনাম এক্সটেনশন ক্লাস:
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web.Mvc;
public static class EnumExtension
{
public static string ToDescription(this System.Enum value)
{
var attributes = (DescriptionAttribute[])value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);
return attributes.Length > 0 ? attributes[0].Description : value.ToString();
}
public static IEnumerable<SelectListItem> ToSelectList<T>(this System.Enum enumValue)
{
return
System.Enum.GetValues(enumValue.GetType()).Cast<T>()
.Select(
x =>
new SelectListItem
{
Text = ((System.Enum)(object) x).ToDescription(),
Value = x.ToString(),
Selected = (enumValue.Equals(x))
});
}
}
মডেল ক্লাস:
public class Company
{
public string CompanyName { get; set; }
public CompanyType Type { get; set; }
}
এবং দেখুন:
@Html.DropDownListFor(m => m.Type,
@Model.Type.ToSelectList<CompanyType>())
এবং যদি আপনি মডেলটির সাথে আবদ্ধ না হয়ে ড্রপডাউনটি ব্যবহার করে থাকেন তবে আপনি পরিবর্তে এটি ব্যবহার করতে পারেন:
@Html.DropDownList("type",
Enum.GetValues(typeof(CompanyType)).Cast<CompanyType>()
.Select(x => new SelectListItem {Text = x.ToDescription(), Value = x.ToString()}))
সুতরাং এটি করার মাধ্যমে আপনি এনাম মানগুলির পরিবর্তে আপনার ড্রপডাউন বর্ণনার বিবরণ আশা করতে পারেন। এছাড়াও এটি সম্পাদনা করার সময়, পৃষ্ঠাটি পোস্ট করার পরে আপনার মডেলটি ড্রপডাউন নির্বাচিত মান দ্বারা আপডেট হবে be
যেমন অন্যরা ইতিমধ্যে বলেছে - কোনও এনামের সাথে ডেটাবাইন্ড করবেন না, যদি না আপনি পরিস্থিতির উপর নির্ভর করে বিভিন্ন এনামের সাথে আবদ্ধ হন। এটি করার বিভিন্ন উপায় রয়েছে, নীচে কয়েকটি উদাহরণ।
ObjectDataSource
অবজেক্টডাটা সোর্স দিয়ে এটি করার একটি ঘোষিত উপায়। প্রথমে এমন একটি বিজনেসঅবজেক্ট শ্রেণি তৈরি করুন যা ড্রপডাউনলিস্টকে আবদ্ধ করতে তালিকায় ফিরে আসবে:
public class DropDownData
{
enum Responses { Yes = 1, No = 2, Maybe = 3 }
public String Text { get; set; }
public int Value { get; set; }
public List<DropDownData> GetList()
{
var items = new List<DropDownData>();
foreach (int value in Enum.GetValues(typeof(Responses)))
{
items.Add(new DropDownData
{
Text = Enum.GetName(typeof (Responses), value),
Value = value
});
}
return items;
}
}
তারপরে এই বিও শ্রেণিতে নির্দেশ করতে এএসপিএক্স পৃষ্ঠায় কিছু HTML মার্কআপ যুক্ত করুন:
<asp:DropDownList ID="DropDownList1" runat="server"
DataSourceID="ObjectDataSource1" DataTextField="Text" DataValueField="Value">
</asp:DropDownList>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server"
SelectMethod="GetList" TypeName="DropDownData"></asp:ObjectDataSource>
এই বিকল্পটির পিছনে কোনও কোডের প্রয়োজন নেই।
ডেটাবাইন্ডের পিছনে কোড
এএসপিএক্স পৃষ্ঠায় এইচটিএমএলকে ছোট করতে এবং কোডের পিছনে আবদ্ধ করতে:
enum Responses { Yes = 1, No = 2, Maybe = 3 }
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
foreach (int value in Enum.GetValues(typeof(Responses)))
{
DropDownList1.Items.Add(new ListItem(Enum.GetName(typeof(Responses), value), value.ToString()));
}
}
}
যাইহোক, কৌশলটি হ'ল getValues, getNames ইত্যাদির এনাম টাইপ পদ্ধতিগুলি আপনার পক্ষে কাজ করতে দেয়।
এএসপি.নেটে কীভাবে এটি করা যায় তা সম্পর্কে আমি নিশ্চিত নই তবে এই পোস্টটি দেখুন ... এটির সাহায্য হতে পারে?
Enum.GetValues(typeof(Response));
আপনি লিনক ব্যবহার করতে পারেন:
var responseTypes= Enum.GetNames(typeof(Response)).Select(x => new { text = x, value = (int)Enum.Parse(typeof(Response), x) });
DropDownList.DataSource = responseTypes;
DropDownList.DataTextField = "text";
DropDownList.DataValueField = "value";
DropDownList.DataBind();
public enum Color
{
RED,
GREEN,
BLUE
}
ddColor.DataSource = Enum.GetNames(typeof(Color));
ddColor.DataBind();
ছয়টি উত্তর ব্যবহার করে জেনেরিক কোড।
public static void BindControlToEnum(DataBoundControl ControlToBind, Type type)
{
//ListControl
if (type == null)
throw new ArgumentNullException("type");
else if (ControlToBind==null )
throw new ArgumentNullException("ControlToBind");
if (!type.IsEnum)
throw new ArgumentException("Only enumeration type is expected.");
Dictionary<int, string> pairs = new Dictionary<int, string>();
foreach (int i in Enum.GetValues(type))
{
pairs.Add(i, Enum.GetName(type, i));
}
ControlToBind.DataSource = pairs;
ListControl lstControl = ControlToBind as ListControl;
if (lstControl != null)
{
lstControl.DataTextField = "Value";
lstControl.DataValueField = "Key";
}
ControlToBind.DataBind();
}
এই উত্তরটি সন্ধান করার পরে আমি যা করি তার থেকে আমি এটিকে সামনে নিয়ে এসেছি (এটি কমপক্ষে আরও মার্জিত) এটি করার উপায়, ভেবেছিলাম আমি ফিরে এসে এখানে ভাগ করে নেব।
Page_Load:
DropDownList1.DataSource = Enum.GetValues(typeof(Response));
DropDownList1.DataBind();
LoadValues:
Response rIn = Response.Maybe;
DropDownList1.Text = rIn.ToString();
SaveValues:
Response rOut = (Response) Enum.Parse(typeof(Response), DropDownList1.Text);
এটি সম্ভবত একটি পুরানো প্রশ্ন .. তবে আমি এইভাবেই করেছি।
মডেল:
public class YourEntity
{
public int ID { get; set; }
public string Name{ get; set; }
public string Description { get; set; }
public OptionType Types { get; set; }
}
public enum OptionType
{
Unknown,
Option1,
Option2,
Option3
}
তারপরে ভিউতে: ড্রপডাউনটি কীভাবে ব্যবহার করা যায় তা এখানে।
@Html.EnumDropDownListFor(model => model.Types, htmlAttributes: new { @class = "form-control" })
এটি আপনার এনাম তালিকার সমস্ত কিছুকে পপুলেশন করা উচিত। আশাকরি এটা সাহায্য করবে..
[Display(Name = "Option number one")] Option1,
এটি আপনি যা খুঁজছেন তা পুরোপুরি নয়, তবে সাহায্য করতে পারে:
http://blog.jeffhandley.com/archive/2008/01/27/enum-list-dropdown-control.aspx
প্রতিটি তালিকার পাস করতে সক্ষম হতে কেন এই জাতীয় ব্যবহার করবেন না নিয়ন্ত্রণ:
public static void BindToEnum(Type enumType, ListControl lc)
{
// get the names from the enumeration
string[] names = Enum.GetNames(enumType);
// get the values from the enumeration
Array values = Enum.GetValues(enumType);
// turn it into a hash table
Hashtable ht = new Hashtable();
for (int i = 0; i < names.Length; i++)
// note the cast to integer here is important
// otherwise we'll just get the enum string back again
ht.Add(names[i], (int)values.GetValue(i));
// return the dictionary to be bound to
lc.DataSource = ht;
lc.DataTextField = "Key";
lc.DataValueField = "Value";
lc.DataBind();
}
এবং ব্যবহার ঠিক যেমন সহজ:
BindToEnum(typeof(NewsType), DropDownList1);
BindToEnum(typeof(NewsType), CheckBoxList1);
BindToEnum(typeof(NewsType), RadoBuuttonList1);
এএসপি.এনইটি এর পরে আরও কিছু কার্যকারিতা সহ আপডেট করা হয়েছে এবং আপনি ড্রপডাউনতে বিল্ট-ইন এনাম ব্যবহার করতে পারেন।
আপনি যদি নিজেই এনামকে বেঁধে রাখতে চান তবে এটি ব্যবহার করুন:
@Html.DropDownList("response", EnumHelper.GetSelectList(typeof(Response)))
যদি আপনি প্রতিক্রিয়াটির কোনও উদাহরণকে আবদ্ধ করেন তবে এটি ব্যবহার করুন:
// Assuming Model.Response is an instance of Response
@Html.EnumDropDownListFor(m => m.Response)
লিনকুইটি ব্যবহার করে ড্রপডাউন থেকে অর্ডার একটি এনাম এবং ডেটাবাইন্ড (পাঠ্য এবং মান) এর জন্য এটি আমার সমাধান
var mylist = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().ToList<MyEnum>().OrderBy(l => l.ToString());
foreach (MyEnum item in mylist)
ddlDivisao.Items.Add(new ListItem(item.ToString(), ((int)item).ToString()));
একটি কাস্টম সাহায্যকারী তৈরির আমার পোস্টে দেখুন "ASP.NET MVC - enums জন্য DropDownList সাহায্যকারী তৈরি করা হচ্ছে": http://blogs.msdn.com/b/stuartleeks/archive/2010/05/21/asp-net-mvc -creating-এ-dropdownlist-সাহায্যকারী-জন্য-enums.aspx
আপনি যদি আপনার কম্বো বাক্সে (বা অন্যান্য নিয়ন্ত্রণ) আরও ব্যবহারকারী বান্ধব বিবরণ রাখতে চান তবে নীচের ফাংশনটির সাথে বর্ণনা বৈশিষ্ট্যটি ব্যবহার করতে পারেন:
public static object GetEnumDescriptions(Type enumType)
{
var list = new List<KeyValuePair<Enum, string>>();
foreach (Enum value in Enum.GetValues(enumType))
{
string description = value.ToString();
FieldInfo fieldInfo = value.GetType().GetField(description);
var attribute = fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false).First();
if (attribute != null)
{
description = (attribute as DescriptionAttribute).Description;
}
list.Add(new KeyValuePair<Enum, string>(value, description));
}
return list;
}
বর্ণিত বৈশিষ্ট্য প্রয়োগ করা একটি এনামের উদাহরণ এখানে রয়েছে:
enum SampleEnum
{
NormalNoSpaces,
[Description("Description With Spaces")]
DescriptionWithSpaces,
[Description("50%")]
Percent_50,
}
তারপরে এভাবে নিয়ন্ত্রণ করতে বাঁধা ...
m_Combo_Sample.DataSource = GetEnumDescriptions(typeof(SampleEnum));
m_Combo_Sample.DisplayMember = "Value";
m_Combo_Sample.ValueMember = "Key";
ভেরিয়েবলের মতো দেখতে না পারা আপনি ড্রপ ডাউনটিতে যা কিছু পাঠাতে চান তা রাখতে পারেন
আপনি এক্সটেনশন পদ্ধতিগুলিও ব্যবহার করতে পারেন। এক্সটেনশনের সাথে ফ্যামিলার নয় তাদের জন্য আমি ভিবি এবং সি # ডকুমেন্টেশন চেক করার পরামর্শ দিই ।
ভিবি এক্সটেনশন:
Namespace CustomExtensions
Public Module ListItemCollectionExtension
<Runtime.CompilerServices.Extension()> _
Public Sub AddEnum(Of TEnum As Structure)(items As System.Web.UI.WebControls.ListItemCollection)
Dim enumerationType As System.Type = GetType(TEnum)
Dim enumUnderType As System.Type = System.Enum.GetUnderlyingType(enumType)
If Not enumerationType.IsEnum Then Throw New ArgumentException("Enumeration type is expected.")
Dim enumTypeNames() As String = System.Enum.GetNames(enumerationType)
Dim enumTypeValues() As TEnum = System.Enum.GetValues(enumerationType)
For i = 0 To enumTypeNames.Length - 1
items.Add(New System.Web.UI.WebControls.ListItem(saveResponseTypeNames(i), TryCast(enumTypeValues(i), System.Enum).ToString("d")))
Next
End Sub
End Module
End Namespace
এক্সটেনশনটি ব্যবহার করতে:
Imports <projectName>.CustomExtensions.ListItemCollectionExtension
...
yourDropDownList.Items.AddEnum(Of EnumType)()
সি # এক্সটেনশন:
namespace CustomExtensions
{
public static class ListItemCollectionExtension
{
public static void AddEnum<TEnum>(this System.Web.UI.WebControls.ListItemCollection items) where TEnum : struct
{
System.Type enumType = typeof(TEnum);
System.Type enumUnderType = System.Enum.GetUnderlyingType(enumType);
if (!enumType.IsEnum) throw new Exception("Enumeration type is expected.");
string[] enumTypeNames = System.Enum.GetNames(enumType);
TEnum[] enumTypeValues = (TEnum[])System.Enum.GetValues(enumType);
for (int i = 0; i < enumTypeValues.Length; i++)
{
items.add(new System.Web.UI.WebControls.ListItem(enumTypeNames[i], (enumTypeValues[i] as System.Enum).ToString("d")));
}
}
}
}
এক্সটেনশনটি ব্যবহার করতে:
using CustomExtensions.ListItemCollectionExtension;
...
yourDropDownList.Items.AddEnum<EnumType>()
আপনি যদি একই সময়ে নির্বাচিত আইটেমটি সেট করতে চান তবে প্রতিস্থাপন করুন
items.Add(New System.Web.UI.WebControls.ListItem(saveResponseTypeNames(i), saveResponseTypeValues(i).ToString("d")))
সঙ্গে
Dim newListItem As System.Web.UI.WebControls.ListItem
newListItem = New System.Web.UI.WebControls.ListItem(enumTypeNames(i), Convert.ChangeType(enumTypeValues(i), enumUnderType).ToString())
newListItem.Selected = If(EqualityComparer(Of TEnum).Default.Equals(selected, saveResponseTypeValues(i)), True, False)
items.Add(newListItem)
System.Enum এ রূপান্তর করে বরং int আকার এবং আউটপুট সমস্যাগুলি এড়ানো হবে। উদাহরণস্বরূপ 0xFFFF0000 uint হিসাবে 4294901760 হবে তবে একটি int হিসাবে -65536 হবে।
ট্রাই কাস্ট এবং সিস্টেম হিসাবে.এনাম কনভার্টের চেয়ে কিছুটা দ্রুত। চেঞ্জটাইপ (এনামটাইপভ্যালিউস [i], এনামউন্ডারটাইপ)। টুস্ট্রিং () (আমার গতির পরীক্ষায় 12:13)।
কমপোবক্স এবং ড্রপডাউনলিস্টের সাথে উভয়ই এএসপ নেট এবং উইনফর্মস টিউটোরিয়াল: সি # উইনফর্ম এবং এএসপি.নেটে কম্বোবক্সের সাথে এনাম কীভাবে ব্যবহার করতে হয়
আশা সাহায্য করে
আপনি এটি অনেক খাটো করতে পারেন
public enum Test
{
Test1 = 1,
Test2 = 2,
Test3 = 3
}
class Program
{
static void Main(string[] args)
{
var items = Enum.GetValues(typeof(Test));
foreach (var item in items)
{
//Gives you the names
Console.WriteLine(item);
}
foreach(var item in (Test[])items)
{
// Gives you the numbers
Console.WriteLine((int)item);
}
}
}