C# 将组合框行映射到相应策略对象的正确方法?
我有一个非常简单的情况,我想知道理想的方法 我有一个组合框。组合框的每一行对应一个特定的策略对象 将组合框行映射到策略对象的正确方法是什么 我做这件事的方式似乎过于复杂,我几乎可以保证有一个简单的标准方式来做这件事 多谢各位 编辑: 我在字典里有数据,字符串是组合框的文本,对象是策略。。。但这不是命令。。。我只知道有一种非常简单的方法 解决方案: 我使用了这个解决方案,但在数据类中使用表示逻辑并不舒服:C# 将组合框行映射到相应策略对象的正确方法?,c#,.net,combobox,C#,.net,Combobox,我有一个非常简单的情况,我想知道理想的方法 我有一个组合框。组合框的每一行对应一个特定的策略对象 将组合框行映射到策略对象的正确方法是什么 我做这件事的方式似乎过于复杂,我几乎可以保证有一个简单的标准方式来做这件事 多谢各位 编辑: 我在字典里有数据,字符串是组合框的文本,对象是策略。。。但这不是命令。。。我只知道有一种非常简单的方法 解决方案: 我使用了这个解决方案,但在数据类中使用表示逻辑并不舒服: private partial class HtmlTransformState : Abs
private partial class HtmlTransformState : AbstractHtmlEditFormState
{
private Dictionary<string, ITransformStrategy> strategies = new Dictionary<string, ITransformStrategy>()
{
{ "Simple URL", new TransformStrategy<SimpleUrlCodeExtractor>() },
{ "Overview", new TransformStrategy<OverviewCodeExtractor>() },
{ "Video List", new TransformStrategy<VideoListCodeExtractor>() },
{ "Video List No MbORKb", new TransformStrategy<VideoListNoMBOrKBAndNoLinksAllowedCodeExtractor>() },
{ "Blue Mountain 2007", new TransformStrategy<BlueMountain2007CodeExtractor>() },
{ "Four Gates", new TransformStrategy<FourGatesCodeExtractor>() },
{ "General", new TransformStrategy<GeneralCodeExtractor>() }
};
public override void DrawForm()
{
// ...
ParentForm.cmboTransformStrategy.DataSource = new BindingSource(strategies, null);
ParentForm.cmboTransformStrategy.DisplayMember = "Key";
ParentForm.cmboTransformStrategy.ValueMember = "Value";
}
public override IEnumerable<string> ProcessHtml(string urlPath)
{
ITransformStrategy transformStrategy = (ITransformStrategy)ParentForm.cmboTransformStrategy.SelectedValue;
// Do some stuff with 'transformStrategy'
}
私有部分类HtmlTransformState:AbstractHtmlEditFormState
{
私有字典策略=新字典()
{
{“简单URL”,新TransformStrategy()},
{“概述”,新的TransformStrategy()},
{“视频列表”,新的TransformStrategy()},
{“视频列表编号MbORKb”,新TransformStrategy()},
{“蓝山2007”,新战略(),
{“四门”,新战略},
{“一般”,新的TransformStrategy()}
};
公共覆盖无效表格()
{
// ...
ParentForm.cmboTransformStrategy.DataSource=新绑定源(策略,空);
ParentForm.cmboTransformStrategy.DisplayMember=“Key”;
ParentForm.cmboTransformStrategy.ValueMember=“Value”;
}
公共重写IEnumerable ProcessHtml(字符串urlPath)
{
ITransformStrategy transformStrategy=(ITransformStrategy)ParentForm.cmbortransformstrategy.SelectedValue;
//用“转型战略”做一些事情
}
}我将使用组合框上的事件并选择相应的字典条目
发现了这一点,请参见下面的工作示例(至少在我编写的原始vb.net代码上)
Vb.net转换为C#,您必须自己管理句柄
public class Form1
{
private Dictionary<int, myDic> dict = new Dictionary<int, myDic>();
private void // ERROR: Handles clauses are not supported in C#
ComboBox1_SelectedIndexChanged(System.Object sender, System.EventArgs e)
{
KeyValuePair<int, myDic> curItem = (KeyValuePair<int, myDic>)ComboBox1.SelectedItem;
MessageBox.Show(curItem.Value.myvalue);
}
private void // ERROR: Handles clauses are not supported in C#
Form1_Load(object sender, System.EventArgs e)
{
myDic d = default(myDic);
for (int i = 0; i <= 10; i++) {
d = new myDic();
d.myKey = i.ToString;
d.myvalue = Strings.Chr(65 + i);
dict.Add(d.GetHashCode, d);
}
ComboBox1.DataSource = new BindingSource(dict, null);
ComboBox1.DisplayMember = "value";
ComboBox1.ValueMember = "Key";
}
}
class myDic
{
public string myKey;
public string myvalue;
public override string tostring()
{
return myvalue;
}
}
公共类表单1
{
专用字典dict=新字典();
private void//错误:C中不支持Handles子句#
ComboBox1\u选择的索引已更改(System.Object sender,System.EventArgs e)
{
KeyValuePair curItem=(KeyValuePair)组合框1.SelectedItem;
MessageBox.Show(curItem.Value.myvalue);
}
private void//错误:C中不支持Handles子句#
Form1_加载(对象发送器,System.EventArgs e)
{
myDic d=默认值(myDic);
for(int i=0;i覆盖策略对象的ToString。之后,您可以直接在组合框中插入策略对象
public class StrategyObject
{
public override string ToString()
{
return "return the text to display";
}
}
StrategyObject selectedStratObj = comboBox1.SelectedItem as StrategyObject;
你是说像下面这样的事情吗
public class Strategy
{
private string _name = "default";
public string Name
{
get { return _name; }
set { _name = value; }
}
public Strategy(string name)
{
_name = name;
}
}
然后在表单加载中(您需要在该表单上有一个组合框):
private void Form1\u加载(对象发送方,事件参数e)
{
列表ls=新列表();
ls.添加(新策略(“第一”);
新增(新策略(“第二”);
新增(新策略(“第三”);
comboBox1.DataSource=ls;
comboBox1.DisplayMember=“Name”;
}
这是我最好的创新之一。:)我真的为这个小家伙感到骄傲
public class Stringable<T>
{
private T _obj;
private Func<T, string> _convertFn;
public Stringable(T obj, Func<T, string> convertFn)
{
_obj = obj;
_convertFn = convertFn;
}
public T GetObj() { return _obj; }
public override string ToString() { return _convertFn(_obj); }
}
公共类可字符串化
{
私人T_obj;
私人职能转换fn;
公共可串接(T obj,Func convertFn)
{
_obj=obj;
_convertFn=convertFn;
}
公共T GetObj(){return_obj;}
公共重写字符串ToString(){return}convertFn(_obj);}
}
这个泛型类将ToString()添加到任何类(即使是黑盒类),您可以在lambda中定义其行为。假设您有一个具有属性FirstName和LastName的类Person。下面是如何使用它填充组合框
_cboPersons.Items.Add(new Stringable<Person>(person,o=>string.Format("{0}, {1}", o.LastName, o.FirstName)));
\u cboPersons.Items.Add(新的Stringable(person,o=>string.Format(“{0},{1}”,o.LastName,o.FirstName));
然后,当选择组合框项目时,只需使用它从组合框中获取原始对象
Person person=(_cboPersons.SelectedItem as Stringable<Person>).GetObj() // Get's person object.
Person-Person=(\u cboPersons.SelectedItem为Stringable)。GetObj()//Get的Person对象。
但是当数据没有排序时,你怎么能使用它呢?就像使用字典一样。这是我做的方式,但它需要一个列表。如果我可以有一个理想的列表。或者和排序的字典…谢谢链接。我将不得不检查它。你在使用吗?你应该看看我的更新答案,如果数据类真的知道它是如何呈现的吗?这似乎违反了SoC…@GordonG:这取决于StrategyObject的结构。例如,如果你有一个Animal集合,并且类Animal有一个属性名。在方法ToString()中返回属性名是完全有效的.现在,如果你需要为你的对象生成一个有效的名称,我的解决方案对你来说并不是最好的。但这是一个很好的主意,我会记住它的。谢谢。我不喜欢将表示信息放在数据类中…这似乎混淆了关注点的分离。另外,谁能说策略对象将g想知道我希望它们在组合框上的格式是怎样的?重点是。在某些情况下,我使用C#的“部分”功能来分离逻辑。数据仍然在同一个类中,但在两个文件中,一个是DB访问层(例如)另一种是关于演示的东西。有很多方法可以组织层次结构,我并不是说一种方法比另一种更好;任何有效的方法都遵循我喜欢的接吻原则:)
Person person=(_cboPersons.SelectedItem as Stringable<Person>).GetObj() // Get's person object.