【问题标题】:assiging text to the correct button without switch statement在没有 switch 语句的情况下将文本分配给正确的按钮
【发布时间】:2015-03-09 10:41:12
【问题描述】:

我正在用 C# 在 VS2012 中为 windows phone 8.0 开发一个应用程序

我的代码工作正常,但它太长了,我认为有一种字符串格式可以在 1 行代码中做同样的事情 问题是我不知道该怎么做

示例:我需要通过按钮的名称(btn2 --> t2,btn3 --> t3)将按钮内容文本字符串分配给正确的 TextBlock

有 8 个按钮 (btn1...btn8) 和 8 个文本块 (t1.....t8)

所以我有这个代码并且它可以工作:

private void LetterClicked(object sender, RoutedEventArgs e)
    {
        Button btn = sender as Button;
        switch (lettersTyped)
                {
                    case 1:
                        t1.Text = btn.Content.ToString();
                        break;
                    case 2:
                        t2.Text = btn.Content.ToString();
                        break;
                    case 3:
                        t3.Text = btn.Content.ToString();
                        break;
                    case 4:
                        t4.Text = btn.Content.ToString();
                        break;
                    case 5:
                        t5.Text = btn.Content.ToString();
                        break;
                    case 6:
                        t6.Text = btn.Content.ToString();
                        break;
                    case 7:
                        t7.Text = btn.Content.ToString();
                        break;
                    case 8:
                        t8.Text = btn.Content.ToString();
                        break;
                }
    }

我想要其他不使用 switch 语句的方法

点赞:t"The code determines the number".Text = btn.Content.ToString();

【问题讨论】:

    标签: c# string windows-phone-8


    【解决方案1】:

    您可以使用您的字母计数和必须更改的控件来初始化Dictionary<int, TextBlock>,并仅引用键入的字母数:

    dic[lettersTyped].Text = btn.Content.ToString();
    

    如果您不想手动初始化所​​有块,可以通过解析文本块 id 来初始化目录。但是我看不出有什么方法可以让你在一行中做到这一点(除非它是一条长线)

    伪代码:

    • 查找所有相关的文本块(例如,id 格式为 textxxx 且 xxx 数字的所有文本块)
    • 为每个文本块 tb 提取 id 的数字部分
    • 在字典中添加一个条目,键为 xxx,值控制为 tb
    • 用字典解引用正确的文本块[键入的键]

    【讨论】:

    • 我不是认真的 1 行,但没有 switch 语句那么多
    • 那么带初始化的字典应该是个好办法,我现在加伪代码
    • 我这样做了,在初始化 Keys (int) 时一切正常,但所有值都设置为 null 尽管我分配了所有 TextBlocks
    • 操作!我在`InitializeComponent();`之前做了这件事,我的错:)
    • 太棒了!现在,如果您有大量文本块,请不要忘记自动注册它们以清理初始化代码
    【解决方案2】:

    制作一个全局(私有/公共/任何)字典:

    private Dictionary<Button, TextBox> dict;
    

    然后在某处初始化它(例如页面的构造函数):

    dict = new Dictionary<Button, TextBox>()
    {
        { btn1, t1 },
        { btn2, t2 }
    };
    

    最后,您将相同的 Click 处理程序附加到所有按钮:

    private void button_Click(object sender, EventArgs e)
    {
        Button btn = sender as Button;
        dict[btn].Text = btn.Text;
    }
    

    Sender 是您单击的 Button,因此您只需从中获取文本并将其附加到 Dictionary 中分配给 Button 的 TextBox。 这样您就不需要处理任何列表索引。

    【讨论】:

    • 这是错误的,lettersTyped 在哪里?它决定了 TextBlock 的数量,谁说过点击事件处理程序?
    • @GabourX 嗯...你?你的 LetterClicked 方法几乎是一样的。你到底需要lettersTyped 做什么?每个 TextBox 都由一个字典对分配给一个按钮。
    • dict[btn] 是一个&lt;Button,TextBox&gt; 并且它没有Text 属性,因此它不能将string 转换为object
    • dict[btn] 将字典中分配的值返回给 btn 键 - 在本例中是一个 TextBox 对象,它具有 Text 属性。
    【解决方案3】:

    您可以将所有文本块添加到列表并进行相应处理:

    List <TextBlock> TBlocks=new List<TextBlock>();
    TBlocks.Add(t1);
    ...
    TBlocks.Add(t8);
    
    private void LetterClicked(object sender, RoutedEventArgs e)
    {
            Button btn = sender as Button;
            TBlocks[lettersTyped-1].Text= btn.Content.ToString();
    }
    

    【讨论】:

    • 这看起来不错,但是当我这样做时它给了我这个错误TBlocks.Add(t1);
    • 参数无效,上下文必须是List&lt;TextBlock&gt;.Add(TextBlock item)
    【解决方案4】:

    如果您的TextBlocks 在一个容器中,例如StackPanel,例如:

    <StackPanel x:Name="container">
        <TextBlock x:Name="t1" />
        <TextBlock x:Name="t2" />
        <TextBlock x:Name="t3" />
        <TextBlock x:Name="t4" />
        <TextBlock x:Name="t5" />
        <TextBlock x:Name="t6" />
        <TextBlock x:Name="t7" />
        <TextBlock x:Name="t8" />
    </StackPanel>
    

    那么就可以通过索引来获取了。

    TextBlock tb = container.Children[lettersTyped - 1] as TextBlock; // Convert lettersTyped to 0-based index
    tb.Text = btn.Content.ToString();
    

    【讨论】:

    • 当我这样做时,所有的 TextBlock 都会消失,但第一个 (tb1)
    • 如果我删除 t1 , t2 会显示自己,看起来它只显示堆栈中的第一个对象
    猜你喜欢
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    相关资源
    最近更新 更多