2011-11-26 7 views
1

실버 라이트 4에 등록 양식을 만들었습니다. 많은 수의 텍스트 상자가 있습니다. 각 텍스트 상자 앞에는 필수 필드 유효성 검사기로 텍스트 블록을 넣었습니다. 텍스트 상자가 비어있는 동안 포커스를 잃어 버리면 앞에 놓인 텍스트 블록이 빨간색이되어야합니다.중첩 된 메서드를 코딩하는 올바른 방법은 무엇입니까?

텍스트 상자 TextBox1에가, 내가 원하는 모든

문제가

, 난 코드 각각의 특정 텍스트 상자에 대한 구체적인 방법을하지 않을 textblocks입니다 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); 
    } 

그렇게 할 몇 가지 더 좋은 방법을 제안 해주십시오 정확하기 않은 ..

+0

당신은 적어도 silverlight에서 사용할 수 있는지 알아 보려면 dataAnnotation을보아야합니다. – davethecoder

+0

그건 작동하지 않습니다. 그냥 텍스트 상자의 배경색을 변경하는 것이 더 좋지 않겠습니까? –

+0

참고로 http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-be-removed-from-posts를 참조하십시오. –

답변

1

이 같은 뭔가가 필요,

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; 
    } 
+0

좋은 직장! 내가 찾던 바로 그거야 ..! – Faizan

0
var textblock = "textblock" + textBox.Name.Remove(0,7); 
TextblockColorChange(textblock); 

이상이 코드는 단지 당신은 어떤 다른 코드를 표시하지 않습니다 TextblockColorChange()

에 문자열을 보낼 것입니다,하지만 난에 결과를 전달하기 전에 해당 문자열의 검색과 같은 FindControl 또는의 FindControl을 수행 할 같은데요 당신의 코드.

+0

그 링크가'Sytem.Web.UI.FindControl()'을 가리킨다 (ASP.NET) –

+0

필자는 일반적인 경우에서 작동 할 FindControl을 구현하는 새로운 링크를 지적했다. – Hogan

2

TextBlock 및 TextBox가 포함 된 UserControl을 만들고이 TextBox 및 TextBox 조합이있는 모든 곳에서이 UserControl을 사용합니다. 그런 다음이 UserControl LostFocus 논리를 내부 및 TextBlock 적절하게 업데이트합니다. 이렇게하면 업데이트 할 컨트롤의 올바른 이름을 찾아 낼 필요가 없습니다.

+0

이것은 현명한 해결책입니다. – AnthonyWJones

1

실제로 빌스 접근 방식을 선호하지만 (여기에서는 템플릿 컨트롤을 사용하고 싶지만) 꽤 재미있는 또 다른 대안이 있습니다. 당신의 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; 
     } 
    } 
+0

합리적인 답변을 주셔서 감사합니다. 정말 도움이되었습니다 !! – Faizan

관련 문제