如何验证Combobox值以匹配数据库值?

时间:2013-11-30 12:23:43

标签: c# wpf visual-studio-2010 validation combobox

我正在创建一个模块,它是一个编辑帐单模块,使用户可以编辑数据库中的可用模块。我面临一个验证问题,即当用户不想编辑账单时点击“取消”按钮将返回列表视图继续选择另一条记录。这是我的问题,因为当用户没有做任何修改和&不小心点击“状态”组合从“UNPAID”到“PAID”然后直接点击。当重新选择记录时,记录状态值将变为“PAID”而不是“UNPAID”,这是实际值。

如果每次用户不进行任何修改时,我该怎么做?返回列表视图将设置组合框的默认值。

感谢大家查看此问题&希望收到回复:)

我会附上我的代码,以便轻松引用: XAML文件

<Window x:Class="HouseWivesSavior.HomecareModule.EditBillRemainder"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="EditBillRemainder" Height="600" Width="800" Loaded="Window_Loaded">
    <Window.Background>


        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
            <GradientStop Color="#FFFFFFFF" Offset="0"/>
            <GradientStop Color="#FFFF00FF" Offset="1"/>
        </LinearGradientBrush>


    </Window.Background>

    <Window.Resources>
        <DataTemplate x:Key="MyDataTemplate">
            <Border BorderBrush="#FF000000" BorderThickness="1,1,0,1" Margin="-6,-2,-6,-2">
                <StackPanel Margin="6,2,6,2">
                    <TextBlock Text="{Binding Path=BillName}"/>
                </StackPanel>
            </Border>
        </DataTemplate>

        <DataTemplate x:Key="MyDataTemplate2">
            <Border BorderBrush="#FF000000" BorderThickness="1,1,0,1" Margin="-6,-2,-6,-2">
                <StackPanel Margin="6,2,6,2">
                    <TextBlock Text="{Binding Path=BillDescription}"/>
                </StackPanel>
            </Border>
        </DataTemplate>

        <DataTemplate x:Key="MyDataTemplate3">
            <Border BorderBrush="#FF000000" BorderThickness="1,1,0,1" Margin="-6,-2,-6,-2">
                <StackPanel Margin="6,2,6,2">
                    <TextBlock Text="{Binding Path=BillAmount}"/>
                </StackPanel>
            </Border>
        </DataTemplate>

        <DataTemplate x:Key="MyDataTemplate4">
            <Border BorderBrush="#FF000000" BorderThickness="1,1,1,1" Margin="-6,-2,-6,-2">
                <StackPanel Margin="6,2,6,2">
                    <TextBlock Text="{Binding Path=BillDueDate, StringFormat='dd-MM-yyyy'}"/>
                </StackPanel>
            </Border>
        </DataTemplate>

        <Style x:Key="MyItemContainerStyle" TargetType="{x:Type ListViewItem}">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="VerticalContentAlignment" Value="Stretch" />
            <!--<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListViewItem_PreviewMouseLeftButtonDown" />-->
        </Style>

        <!--DatePickerTextBoxFormat-->
        <Style TargetType="{x:Type DatePickerTextBox}">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <TextBox x:Name="PART_TextBox" Text="{Binding Path=SelectedDate, StringFormat='dd-MM-yyyy', RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" />
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>


    </Window.Resources>

    <Grid>
        <ListView Name="lvwBooks" Background="White" ItemsSource="{Binding}" Margin="131,130,4,6" ItemContainerStyle="{DynamicResource MyItemContainerStyle}">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Bill Name" Width="100"  CellTemplate="{DynamicResource MyDataTemplate}"/>
                    <GridViewColumn Header="Description" Width="250"  CellTemplate="{DynamicResource MyDataTemplate2}"/>
                    <GridViewColumn Header="Amount" Width="160"  CellTemplate="{DynamicResource MyDataTemplate3}"/>
                    <GridViewColumn Header="Due Date" Width="100"  CellTemplate="{DynamicResource MyDataTemplate4}"/>
                    <GridViewColumn Header="Edit">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <UserControl>
                                    <Hyperlink Click="InputBox_Click">Edit
                                        <Hyperlink.Style>
                                            <Style TargetType="{x:Type Hyperlink}">
                                                <Setter Property="Hyperlink.IsEnabled" Value="False" />
                                                <Style.Triggers>
                                                    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}, Path=IsSelected}" Value="True">
                                                        <Setter Property="Hyperlink.IsEnabled" Value="True" />
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </Hyperlink.Style>
                                    </Hyperlink>
                                </UserControl>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>


            </ListView.View>
        </ListView>
        <!-- It's important that this is in the end of the XAML as it needs to be on top of everything else! -->
        <Grid x:Name="InputBox" Visibility="Collapsed">
            <Grid Background="Black" Opacity="0.5" />
            <Border
            MinWidth="250"
            Background="Orange" 
            BorderBrush="Black" 
            BorderThickness="1" 
            CornerRadius="0,40,0,40" 
            HorizontalAlignment="Center" 
            VerticalAlignment="Center" Height="493" Margin="130,30,120,38" Width="528">
                <Canvas Height="446" Width="524">

                    <GroupBox Header="General Information" Height="141" HorizontalAlignment="Left" Margin="193,52,0,0" Name="groupBox1" VerticalAlignment="Top" Width="495" Canvas.Left="-173" Canvas.Top="-67">
                        <Canvas Background="WhiteSmoke" Opacity="1">
                            <GridSplitter Background="#FFBCBCBC" HorizontalAlignment="Left" Margin="207,13,0,140" ResizeBehavior="PreviousAndNext" Width="2" Height="50" Canvas.Left="-3" Canvas.Top="48" />
                            <TextBlock Height="23" HorizontalAlignment="Left" Margin="6,6,0,0" Name="textBlock1" Text="Bill Name" VerticalAlignment="Top" />
                            <TextBlock Height="23" HorizontalAlignment="Left" Margin="215,65,0,0" Name="textBlock4" Text="Due Date" VerticalAlignment="Top" Grid.ColumnSpan="2" />
                            <GridSplitter HorizontalAlignment="Left" ResizeBehavior="PreviousAndNext"
                  Width="1" Background="#FFBCBCBC" Margin="206,63,0,9" />
                            <DatePicker Height="25" HorizontalAlignment="Right" Margin="0,80,157,0" Name="BillDueDatedatePicker" VerticalAlignment="Top" Width="115" Grid.ColumnSpan="2" Canvas.Left="215" Canvas.Top="6" Text="{Binding Path=BillDueDate, StringFormat='dd-MM-yyyy'}" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}" SelectedDateFormat="Short"/>
                            <TextBox Height="23" HorizontalAlignment="Left" Margin="7,29,0,0" Name="BillNameTxtBox" VerticalAlignment="Top" Width="458" Grid.ColumnSpan="2" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}" Text="{Binding Path=BillName}"/>
                            <TextBlock Height="23" HorizontalAlignment="Left" Margin="7,63,0,0" Name="textBlock8" Text="Bill Type" VerticalAlignment="Top" />
                            <ComboBox Height="23" HorizontalAlignment="Left" Margin="8,81,0,0" Name="BillTypeCboBox" VerticalAlignment="Top" Width="193"  Canvas.Left="-5" Canvas.Top="8" Text="{Binding Path=BillTypes}" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}">
                                <ComboBoxItem Content="Water" />
                                <ComboBoxItem Content="Electricity" />
                                <ComboBoxItem Content="Gas" />
                                <ComboBoxItem Content="Internet/broadband"/>
                                <ComboBoxItem Content="Others"/>
                            </ComboBox>
                            <TextBox Canvas.Left="62" Canvas.Top="3" Height="23" Name="textBox1" Width="120" Visibility="Visible" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}" Text="{Binding Path=BillNo}"/>
                        </Canvas>
                    </GroupBox>

                    <GroupBox Header="Payment Information" Height="339" HorizontalAlignment="Left" Margin="193,202,0,0" Name="groupBox2" VerticalAlignment="Top" Width="495" Canvas.Left="-174" Canvas.Top="-81">
                        <Canvas Background="WhiteSmoke" Height="303" Visibility="Visible">
                            <TextBlock Height="23" HorizontalAlignment="Left" Margin="7,17,0,0" Name="textBlock6" Text="Amount Due" VerticalAlignment="Top" />
                            <TextBlock Height="23" HorizontalAlignment="Left" Margin="7,75,0,0" Name="textBlock7" Text="Description" VerticalAlignment="Top" />
                            <TextBox Height="23" HorizontalAlignment="Left" Margin="81,14,0,0" Name="BillAmountTxtBox" VerticalAlignment="Top" Width="120" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}" Text="{Binding Path=BillAmount}"/>
                            <TextBox Height="148" HorizontalAlignment="Left" Margin="4,96,0,0" Name="BillDescriptionTxtBox" VerticalAlignment="Top" Width="471"  VerticalScrollBarVisibility="Visible" SpellCheck.IsEnabled="True" TextWrapping="Wrap" AcceptsReturn="True" Text="{Binding Path=BillDescription}" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}"/>
                            <TextBlock Height="23" HorizontalAlignment="Left" Margin="6,46,0,0" Name="textBlock9" Text="Status" VerticalAlignment="Top" />
                            <ComboBox Height="23" HorizontalAlignment="Left" Margin="81,46,0,0" Name="BillStatusCboBox" VerticalAlignment="Top" Width="120"   SelectionChanged="comboBox3_SelectionChanged" Text="{Binding Path=BillStatus}" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}" >
                                <ComboBoxItem Content="UNPAID" />
                                <ComboBoxItem Content="PAID" />
                            </ComboBox>
                            <TextBlock Height="23" HorizontalAlignment="Left" Margin="215,14,0,0" Name="textBlock10" Text="Bill is Paid:" VerticalAlignment="Top" />
                            <DatePicker Text="{Binding Path=BillPaidDate}" Height="25" HorizontalAlignment="Left" Margin="212,37,0,0"  Name="BillPaidDatedatePicker" VerticalAlignment="Top" Width="115" IsEnabled="false" DataContext="{Binding ElementName=lvwBooks, Path=SelectedItem}"/>
                            <GridSplitter Background="#FFBCBCBC" HorizontalAlignment="Left" Margin="205,14,0,228" ResizeBehavior="PreviousAndNext" Width="2" />
                            <Separator Height="26" HorizontalAlignment="Left" Margin="7,250,0,0" Name="separator1" VerticalAlignment="Top" Width="470" />
                            <Button Content="Done" Height="23" HorizontalAlignment="Left" Margin="322,267,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="YesButton_Click" />
                            <Button Content="Cancel" Height="23" HorizontalAlignment="Left" Margin="402,266,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="NoButton_Click" />
                            <GridSplitter Background="#FFBCBCBC" HorizontalAlignment="Left" Margin="207,13,0,140" ResizeBehavior="PreviousAndNext" Width="0" />
                        </Canvas>
                    </GroupBox>
                </Canvas>
            </Border>
        </Grid>
     </Grid>

</Window>

代码背后:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

using System.Data.SqlClient;
using System.Configuration;
using System.Data;

namespace HouseWivesSavior.HomecareModule
{
    /// <summary>
    /// Interaction logic for EditBillRemainder.xaml
    /// </summary>
    public partial class EditBillRemainder : Window
    {
        public EditBillRemainder()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            ShowData();
        }



        private void InputBox_Click(object sender, RoutedEventArgs e)
        {
            // CoolButton Clicked! Let's show our InputBox.
            InputBox.Visibility = System.Windows.Visibility.Visible;
        }



        private void NoButton_Click(object sender, RoutedEventArgs e)
        {
            //ShowData();
            // NoButton Clicked! Let's hide our InputBox.
            InputBox.Visibility = System.Windows.Visibility.Collapsed;
        }

        private void ListViewItem_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            var item = sender as ListViewItem;
            if (item != null && item.IsSelected)
            {

            }
        }

        //Design
        private void comboBox3_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ////The logic for this will be stanger but in order to cope iwht the SelectionChange behavior.
            //string s1 = BillStatusCboBox.SelectionBoxItem.ToString();
            //// MessageBox.Show(s1);
            //if (s1.Equals("UNPAID"))
            //{
            //    BillPaidDatedatePicker.IsEnabled = true;
            //    BillPaidDatedatePicker.Text = DateTime.Now.ToString("d/MM/yyyy");
            //}

            //if (s1.Equals("PAID"))
            //{
            //    BillPaidDatedatePicker.IsEnabled = false;
            //    //BillStatusCboBox.SelectedIndex = 0;
            //}

            ComboBoxItem currentItem = ((System.Windows.Controls.ComboBoxItem)BillStatusCboBox.SelectedItem);

            if (currentItem.Content.Equals("PAID"))
            {
                BillPaidDatedatePicker.IsEnabled = true;

                // BuilderupdateButton.Visibility = Visibility.Visible;
            }
            else {
                BillPaidDatedatePicker.IsEnabled = false;
            }



        }
        //Database
        public void ShowData()
        {
            SqlConnection conn;

            string connStr = ConfigurationManager.ConnectionStrings["house"].ConnectionString;
            conn = new SqlConnection(connStr);

            //SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True");
            conn.Open();
            SqlCommand comm = new SqlCommand("Select * from bill ORDER BY BillDueDate", conn);
            DataTable dt = new DataTable();
            SqlDataAdapter da = new SqlDataAdapter(comm);
            da.Fill(dt);
            lvwBooks.DataContext = dt.DefaultView;
        }

        private void YesButton_Click(object sender, RoutedEventArgs e)
        {
            Update();
            // YesButton Clicked! Let's hide our InputBox and handle the input text.
            InputBox.Visibility = System.Windows.Visibility.Collapsed;
        }

        public void Update() { 
            SqlConnection conn;
            SqlCommand cmdInsert;
            String strUpdate;


            string connStr = ConfigurationManager.ConnectionStrings["house"].ConnectionString;
            conn = new SqlConnection(connStr);


            strUpdate = "UPDATE bill SET BillName=@BillName, BillTypes=@BillTypes, BillDueDate=@BillDueDate, BillAmount=@BillAmount, BillStatus=@BillStatus, BillPaidDate=@BillPaidDate, BillDescription=@BillDescription WHERE BillNo='" + textBox1.Text + "' ";

                cmdInsert = new SqlCommand(strUpdate, conn);

                cmdInsert.Parameters.AddWithValue("@BillName", BillNameTxtBox.Text);
                cmdInsert.Parameters.AddWithValue("@BillTypes", BillTypeCboBox.Text);
                cmdInsert.Parameters.AddWithValue("@BillDueDate", DateTime.Parse(BillDueDatedatePicker.Text));
                cmdInsert.Parameters.AddWithValue("@BillAmount", BillAmountTxtBox.Text);
                cmdInsert.Parameters.AddWithValue("@BillStatus", BillStatusCboBox.Text);
                //MessageBox.Show(BillPaidDatedatePicker.Text);
                if (BillPaidDatedatePicker.Text.Equals(""))
                {
                    cmdInsert.Parameters.AddWithValue("@BillPaidDate", "");
                }
                else {
                    cmdInsert.Parameters.AddWithValue("@BillPaidDate", DateTime.Parse(BillPaidDatedatePicker.Text));
                }
               // cmdInsert.Parameters.AddWithValue("@BillPaidDate", DateTime.Parse(empty));
                cmdInsert.Parameters.AddWithValue("@BillDescription", BillDescriptionTxtBox.Text);

                try
                {
                    conn.Open();
                    int result = cmdInsert.ExecuteNonQuery();
                    if (result == 1)
                    {
                        MessageBox.Show("Bill Edited!!!");

                    }
                }
                catch (SqlException ex)
                {
                    MessageBox.Show(ex.ToString());
                }
                finally {
                    conn.Close();
                }
            }
    }
}

2 个答案:

答案 0 :(得分:0)

对于这种情况,最好使用IDataErrorInfo接口而不是使用ValiationRule,因为IDataErrorInfo将在ViewModel中处理,在那里您还拥有所有必要的数据库语句。

这是一个教程的链接,解释了如何使用IDataErrorInfo进行验证。

http://codeblitz.wordpress.com/2009/05/08/wpf-validation-made-easy-with-idataerrorinfo/

玩得开心:)

答案 1 :(得分:0)

我这样解决了: 代码隐藏: 我遇到的问题是NullReferenceException然后我用try..catch来捕获“NullReferenceException”

private void comboBox3_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

    ComboBoxItem currentItem = ((System.Windows.Controls.ComboBoxItem)BillStatusCboBox.SelectedItem);
    try
    {
        if (currentItem.Content.Equals("PAID"))
        {
            BillPaidDatedatePicker.IsEnabled = true;

            // BuilderupdateButton.Visibility = Visibility.Visible;
        }
        else
        {
            BillPaidDatedatePicker.IsEnabled = false;
        }
    }
    catch (NullReferenceException ex){ // At here which you can see.
       //I purposely set it to do nothing when catch it.
    }

然后当用户意外点击“UPAID”到“PAID”&amp;直接点击取消按钮将调用“NoButton_Click”,这将尝试重新加载&amp;从数据库中选择值:

 private void NoButton_Click(object sender, RoutedEventArgs e)
        {
            ShowData(); // Invoke & select from database again.
            // NoButton Clicked! Let's hide our InputBox.
            InputBox.Visibility = System.Windows.Visibility.Collapsed;
        }

我知道通过这种方式解决我的问题将会非常低效但是完成工作:)这对我来说很好。