-3

我的窗口中有 3 个文本框。当我在文本框中输入错误的字符时,它应该通过使用验证显示错误。我在 WPF 中这样做,请帮助我编写代码

这是我的 XAML 代码

<Window x:Class="DataGrid_DataBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="IDDATA" Height="350" Width="525">

<Grid>
    <DataGrid AutoGeneratingColumn="DG1_AutoGeneratingColumn" Name="dgsample" BorderBrush="Black" BorderThickness="2" AutoGenerateColumns="True" CanUserAddRows="True" CanUserDeleteRows="True" CanUserSortColumns="False"  Margin="200,10,10,75">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Id" Visibility="Hidden" Binding="{Binding Path=Id}"  />
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"  />
            <DataGridTextColumn Header="Salary" Binding="{Binding Path=Salary}"  />
        </DataGrid.Columns>
    </DataGrid>

    <Label  Content="ID :" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="26" Width="27"/>
    <Label  Content="Name :" HorizontalAlignment="Left" Margin="10,60,0,0" VerticalAlignment="Top" Height="26" Width="48"/>
    <Label  Content="Salary :" HorizontalAlignment="Left" Margin="10,110,0,0" VerticalAlignment="Top" Height="26" Width="47"/>

    <TextBox Name="tb1" HorizontalAlignment="Left" Height="20" Margin="60,10,0,0" TextWrapping="NoWrap" Text="{Binding SelectedItem.Id, ElementName=dgsample,ValidatesOnNotifyDataErrors=True,ValidatesOnExceptions=True,NotifyOnValidationError=True,UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="100" />

    <TextBox Name="tb2" HorizontalAlignment="Left" Height="20" Margin="60,60,0,0" TextWrapping="NoWrap" Text="{Binding SelectedItem.Name, ElementName=dgsample,ValidatesOnNotifyDataErrors=True,ValidatesOnExceptions=True,NotifyOnValidationError=True}" VerticalAlignment="Top" Width="100"/>
    <TextBox Name="tb3" HorizontalAlignment="Left" Height="20" Margin="60,110,0,0" TextWrapping="NoWrap" Text="{Binding SelectedItem.Salary, ElementName=dgsample,ValidatesOnNotifyDataErrors=True,ValidatesOnExceptions=True,NotifyOnValidationError=True}" VerticalAlignment="Top" Width="100"/>

    <Button Content="Get" HorizontalAlignment="Left" Margin="10,190,0,0" VerticalAlignment="Top" Width="75" Click="Get_Click" />
    <Button Content="Add" HorizontalAlignment="Left" Margin="10,230,0,0" VerticalAlignment="Top" Width="75" Click="Add_Click" />
    <Button Content="Delete" HorizontalAlignment="Left" Margin="10,270,0,0" VerticalAlignment="Top" Width="75" Click="Delete_Click" />
</Grid>

这是 .cs 代码

public partial class MainWindow : Window
{
    ObservableCollection<User> Users = new ObservableCollection<User>();
    public MainWindow()
    {
        InitializeComponent();

        Users.Add(new User() { Id = 101, Name = "allen", Salary = 10 });
        Users.Add(new User() { Id = 102, Name = "scott", Salary = 20 });
        Users.Add(new User() { Id = 103, Name = "mickey", Salary = 30 });
        Users.Add(new User() { Id = 104, Name = "micheal", Salary = 40 });
        Users.Add(new User() { Id = 105, Name = "fletch", Salary = 50 });
        Users.Add(new User() { Id = 106, Name = "etcher", Salary = 60 });

        dgsample.ItemsSource = Users;

    }
    private void DG1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        switch (e.Column.Header.ToString())
        {
            case "Id":

                e.Column.Visibility = Visibility.Hidden;
                break;
            case "Name":
                e.Column.Visibility = Visibility.Hidden;
                break;
            case "Salary":
                e.Column.Visibility = Visibility.Hidden;
                break;
        }
    }

    private void Get_Click(object sender, RoutedEventArgs e)
    {


        int index;
        if (int.TryParse(this.tb1.Text, out index))
        {
            User currentUser = Users.FirstOrDefault(Select => Select.Id == int.Parse(tb1.Text));
            if (currentUser != null)
            {
                this.tb2.Text = currentUser.Name;
                this.tb3.Text = currentUser.Salary.ToString();
            }
            else
                MessageBox.Show("User with the provided ID does not Exist", "Error");
        }
        else
            MessageBox.Show("ID entered is not valid number", "Error");





    }



    private void Add_Click(object sender, RoutedEventArgs e)
    {


        if (!tb1.Text.Equals(""))
        {
            var adduser = Users.Where(User => User.Id == int.Parse(tb1.Text));

            if (!adduser.Any())
            {
                Users.Add(new User() { Id = int.Parse(tb1.Text), Name = tb2.Text, Salary = int.Parse(tb3.Text) });
            }

            else

                MessageBox.Show("Someone already has that ID.");

        }

    }

    private void Delete_Click(object sender, RoutedEventArgs e)
    {
        int index;
        if (int.TryParse(this.tb1.Text, out index))
        {
            User currentUser = Users.FirstOrDefault(Select => Select.Id == int.Parse(tb1.Text));
            if (currentUser != null)
            {
                Users.Remove(currentUser);
            }
            else
                MessageBox.Show("User with the provided ID does not Exist", "Error");
        }
        else
            MessageBox.Show("ID entered is not valid number", "Error");

    }

}
4

1 回答 1

1

你可以在这里找到答案:

stackoverflow.com

最简单的应该是这样的:

首先IDataErrorInfo在你的User类上实现,所以它或多或少看起来像这样:

public class User : IDataErrorInfo, INotifyPropertyChanged
{
    private int id;
    public int Id
    {
        get
        {
            return id;
        }
        set
        {
            id = value;
            OnPropertyChanged("Id");
        }
    }
    private string name;
    public string Name
    {
        get
        {
            return name;
        }
        set
        {
            name = value;
            OnPropertyChanged("Name");
        }
    }
    private int salary;
    public int Salary {
        get
        {
            return salary;
        }
        set
        {
            salary = value;
            OnPropertyChanged("Salary");
        }
    }

    public string Error
    {
        get
        {
            return null;
        }
    }

    public string this[string columnName]
    {
        get
        {
            string result = null;
            if (columnName == "Name")
            {
                if (string.IsNullOrEmpty(Name))
                {
                    result = "Please enter a First name";
                }
            }
            if (columnName == "Salary")
            {
                if (Salary <= 0)
                {
                    result = "Please enter a valid salary";
                }
            }
            if (columnName == "Id")
            {
                if (Id < 0)
                {
                    result = "Please enter a valid id";
                }
            }
            return result;
        }
    }

    public User()
    {

    }

    public User(int id, string name, int salary)
    {
        Id = id;
        Name = name;
        Salary = salary;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

MainWindow.xaml.cs然后在您的文件中创建一个属性:

private User currUser;
public User CurrUser { get; set; }

只是为了看看它在你的构造函数中工作添加:

public MainWindow()
{
    CurrUser = new User();
    InitializeComponent();
}

将此添加到您的Windowin MainWindow.xaml

<Window
Name="myWindow"
...

最后,您可以TextBoxes像这样添加:

<TextBox Name="tb1" Height="23" Margin="51,191,0,0" Width="120" Text="{Binding Path=CurrUser.Id,  ElementName=myWindow, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>
<TextBox Name="tb2" Height="23" Margin="51,219,0,0" Width="120" Text="{Binding Path=CurrUser.Name,  ElementName=myWindow, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>
<TextBox Name="tb3" Height="23" Margin="50,163,0,0" Width="120" Text="{Binding Path=CurrUser.Salary,  ElementName=myWindow, Mode=TwoWay, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>

现在如果类中的条件User不满足TextBoxe.Text,它们的边框会变成红色,这说明存在验证问题。

验证屏幕

根据问题所有者的要求进行编辑

此外,要使用连接到DataGrid中当前选定项目的TextBoxes进行验证,您可以将SelectionChanged事件添加到网格并像这样实现它:

private void dgsample_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    int index = dgsample.SelectedIndex;

    CurrUser.Id = users[index].Id;
    CurrUser.Salary = users[index].Salary;
    CurrUser.Name = users[index].Name;
}

但是要通知TextBox属性更改,您必须对User类进行一些额外的更改(更新答案开头的代码)。

我的网格定义:

XAML

<DataGrid Name="Grid" HorizontalAlignment="Left" Margin="326,10,0,0" VerticalAlignment="Top" RenderTransformOrigin="-0.083,-1.154" Height="140" Width="181" FontStyle="Normal" SelectionChanged="Grid_SelectionChanged">

代码隐藏- MainWindow 构造函数

public MainWindow()
{
    CurrUser = new User();
    users = new ObservableCollection<User>();
    users.Add(new User() { Id = 101, Name = "gin", Salary = 10 });
    users.Add(new User() { Id = 102, Name = "alen", Salary = 20 });
    users.Add(new User() { Id = 103, Name = "scott", Salary = 30 });
    users.Add(new User() { Id = 104, Name = "a", Salary = 30 });

    InitializeComponent();
    Grid.ItemsSource = users;
}

老实说,您需要的一切都可以在这里找到:

www.codeproject.com

codeblitz.wordpress.com

于 2013-10-22T12:46:21.590 回答