Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将组合框行映射到相应策略对象的正确方法?_C#_.net_Combobox - Fatal编程技术网

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.