1

エンティティ フレームワークを使用して、組織がデータをデータベースに入力してレコードを表示するためのデスクトップ アプリケーションを作成しています。

tab control検証済みの を使用してを作成しましたdata template。これにより、必要な必須フィールドを保存できるようになりました。

追加された詳細を表示するために、ページ上で一連の異なるデータ グリッドを使用しました。このページ内にはcommands、ユーザーがコンテンツを追加、更新、または削除できるようにする一連のさまざまなページが含まれています (テーブルによっては、更新のみが許可されます)。

しかし、これは私が動けなくなるところです。これまでのところ、add メソッドと delete メソッドは完全に機能しますが、テーブルの更新になると、Null Reference Exception.

以下にいくつかのコード スニペットを示します。ビューモデル:

    public List<Employee> LoadEmployee
    {
        get
        {
            using (DBEntities context = new DBEntities())
            {
                var query = from e in context.Employees
                            select e;
                return query.ToList<Employee>();
            }
        }
    }

    public void UpdateEmployee()
    {
        var employee = new Employee();

        using (DBEntities context = new DBEntities())
        {
            //var emp = context.Employees.Where(e => e.EmployeeID == employee.EmployeeID).FirstOrDefault();

            var emp = (from a in context.Employees
                       where a.EmployeeID == EmployeeID
                       select a).FirstOrDefault();

            if (emp == null)
            {
                emp.EmployeeID = EmployeeID;
                emp.OrganisationID = OrganisationID;
                emp.Title = Title;
                emp.FirstName = FirstName;
                emp.Surname = Surname;
                emp.Position = Position;
                emp.DateOfBirth = DateOfBirth;
                emp.Address = Address;
                emp.Country = Country;
                emp.Postcode = Postcode;
                emp.PhoneNumber = PhoneNumber;
                emp.MobileNumber = MobileNumber;
                emp.FaxNumber = FaxNumber;
                emp.Email = Email;
                emp.NINumber = NINumber;
                emp.ChargableResource = ChargableResource;
                emp.ChargeOutRate = ChargeOutRate;
                emp.TimeSheetRequired = TimeSheetRequired;
                emp.WorkShift = WorkShift;
                emp.WorkShift = BenefitsProvided;

                //context.Employees.Attach(emp);
                context.SaveChanges();

                MessageBox.Show("Updated Employee Details");
            }
            else
            {
                MessageBox.Show("Unable to update selected item.");
            }
        }
    }

    public Employee _SelectedEmployee;
    public Employee SelectedEmployee
    {
        get
        {
            return _SelectedEmployee;
        }
        set
        {
            if (_SelectedEmployee == value)
                return;

            _SelectedEmployee = value;
            OnPropertyChanged("_SelectedEmployee");
        }
    }

コードビハインド:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        listview.DataContext = new EmployeeViewModel();
    }

    private void btnupdate_Click(object sender, RoutedEventArgs e)
    {
        var emp = new EmployeeViewModel();

        Employee selected = listview.SelectedItem as Employee;

        if (selected == null)
            MessageBox.Show("You must select a 'Employee' before updating.");
        else
        {
        UpdateEmployeeView update = new UpdateEmployeeView();

        update.ShowDialog();
        Window_Loaded(null, null);
        }
    }

xaml;

            IsSynchronizedWithCurrentItem="False"
            ItemsSource="{Binding LoadEmployee}"
            SelectedItem="{Binding SelectEmployee}" Grid.RowSpan="2">

まず、ユーザーがデータ グリッドから行を選択すると、その特定の行が更新されます。ビューモデルに渡されるように、ビューモデルのプロパティを xaml のテキスト フィールドにバインドしました。また、ビュー モデル内に ID プロパティをハード コードしようとしました。public int _EmployeeID = 11; public int _OrganisationID = 4;しかし、これはまだスローしNull Reference Exceptionます。

誰でも私と一緒にこの問題を解決するのを手伝ってもらえますか? いろいろな方法を試してみましたが、まだ役に立ちません。私はWPFを初めて使用し、MVVMを実装しようとしています。明らかに完全なMVVMではありませんが、正しい実装方法をゆっくりと確実に学んでいます。乾杯。

4

2 に答える 2

2
if (emp == null)
 {

行を追加:

emp = new Employee();

それ以外の場合は、null 変数に値を代入しています。

于 2012-12-10T11:32:13.883 に答える
1

コードビハインド内で、をEFにマッピングしTextBoxましたEntities(これは間違った方法であることがわかっていますが、MVVMまだ学習しているため、これは変更されます。

基本的に、私はすべてのtextboxアイテムを割り当てていて、IDを割り当てていませんでした。したがって、IDが割り当てられていないために更新するテーブルのアイテムを識別できなかったため、更新できませんでした。

そのようです;

txtID.Text = type.OrganisationTypeDetailID.ToString();
于 2013-02-18T10:24:45.783 に答える