【问题标题】:What is the correct way to code the nested methods?编写嵌套方法的正确方法是什么?
【发布时间】:2011-11-26 19:27:21
【问题描述】:

我在 silverlight 4 中创建了一个注册表单,其中我有大量文本框,在每个文本框前面我放置了一个文本块作为必填字段验证器,当任何文本框留空时在失去焦点时,放在它前面的文本块必须变成红色。

名为 textbox1、textbox2 ... 的文本框以及文本块

问题是,我不想为每个特定文本框编写特定方法,我只想用两个三个方法完成这样的操作

我在这里做了一些似乎不正确的编码

    private void textBox_LostFocus(object sender, RoutedEventArgs e)
    {
        var textBox = (TextBox) sender;
        if (textbox.Text == "")
           { 
               var textblock = "textblock" +  textBox.Name.Remove(0,7);
               TextblockColorChange(textblock);
           }
    }
    private void TextblockColorChange(object sender)
    {
         var textblock = (TextBlock) sender;
         textblock.Foreground= new SolidColorBrush(Colors.Red);
    }

请提出一些更好的方法。

【问题讨论】:

  • 你不需要查看 dataAnnotation 至少看看这是否可以在 silverlight 中使用
  • 那行不通。改变文本框的背景颜色不是更好吗?
  • 仅供参考,请参阅meta.stackexchange.com/questions/2950/…

标签: c# silverlight function


【解决方案1】:

我将创建一个包含 TextBlock 和 TextBox 的 UserControl,并在您当前拥有 TextBlock 和 TextBox 组合的任何地方使用此 UserControl。然后这个 Usercontrol 将在其中包含 LostFocus 逻辑并适当地更新 TextBlock。这可以避免需要找出要更新的控件的正确名称。

【讨论】:

  • 这是明智的解决方案。
【解决方案2】:

你需要这样的东西,

XAML 部分:

<Grid x:Name="LayoutRoot" Background="White">
    <StackPanel Orientation="Horizontal" Height="25">
        <TextBox Width="150" LostFocus="TextBox_LostFocus"/>
        <TextBlock Text="*" Foreground="#FF0000" VerticalAlignment="Center" Margin="10,0,0,0" Visibility="Collapsed"/>
    </StackPanel>
</Grid>

C#部分:

        private void TextBox_LostFocus(object sender, RoutedEventArgs e)
    {
        var textbox = sender as TextBox;
        if(textbox == null) return;

        var stackPanel = textbox.Parent as StackPanel;
        if(stackPanel == null) return;

        var textBlock = stackPanel.Children.Where(a => a is TextBlock).FirstOrDefault();
        if (textBlock == null) return;
        if (string.IsNullOrEmpty(textbox.Text)) textBlock.Visibility = Visibility.Visible;
        else textBlock.Visibility = Visibility.Collapsed;
    }

【讨论】:

  • 干得好!这正是我要找的东西..!
【解决方案3】:

虽然我实际上更喜欢 Bills 方法(尽管我倾向于使用模板化控件),但这是另一种非常有趣的替代方法。在您的 xaml 中使用这种标记:-

 <TextBlock Text="Enter Value 1" Foreground="{Binding Tag, ElementName=textBox1, TargetNullValue=Black}" />
 <TextBox x:Name="textBox1" LostFocus="txt_LostFocus" />

您常用的txt_LostFocus 可能如下所示:-

    private void txt_LostFocus(object sender, RoutedEventArgs e)
    {
        TextBox txt = ((TextBox)sender);
        if (String.IsNullOrEmpty(txt.Text))
        {
            txt.Tag = new SolidColorBrush(Colors.Red);
        }
        else
        {
            txt.Tag = null;
        }
    }

【讨论】:

  • 感谢您的明智回答,真的很有帮助!!
【解决方案4】:
var textblock = "textblock" +  textBox.Name.Remove(0,7);
TextblockColorChange(textblock);

上面的代码只会发送一个字符串到TextblockColorChange()

您没有显示任何其他代码,但我猜您想在将结果传递给您的代码之前对该字符串执行 FindControl 或 FindControl 之类的搜索。

【讨论】:

  • 我指出了一个新的链接,它实现了一个可以在一般情况下工作的 FindControl。
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多