2017-12-26 12 views
-1

enter image description here データグリッドに8列あり、特定の行が空のときに削除ボタンをクリックすると、「タイプ 'MS.Internal.NamedObject'オブジェクトをキャストすることができません。 「pojo」と入力してください。DataGridで空の行を削除できないWPF

[![ここに画像の説明を入力]

これは私のモデルクラスです...

public class pojo : INotifyPropertyChanged 
     { 

      private string prefix; 
      private int year; 

      public string Prefix 
      { 
       get { return prefix; } 
       set 
       { 
        if (prefix == value) return; 
        prefix = value; 
        OnPropertyChanged(nameof(PeriodName)); 
       } 
      } 
      public int Year 
      { 
       get { return year; } 
       set 
       { 
        if (year == value) return; 
        year = value; 
        OnPropertyChanged(nameof(PeriodName)); 
       } 
      } 

      public int QuarterNo { get; set; } 
      public int SerialNo { get; set; } 
      public string From { get; set; } 
      public string To { get; set; } 
      public string PeriodName => prefix + '-' + (year % 100).ToString(); 

      public event PropertyChangedEventHandler PropertyChanged; 
      void OnPropertyChanged(string prop) 
      { 
       PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop)); 
      } 

     } 

これは私の[削除]ボタンのクリックイベントです...

private void Delete_Btn_Click(object sender, RoutedEventArgs e) 
     { 
      if (calendarmstrDG.SelectedItem != null) 
      { 
       models.Remove((pojo)calendarmstrDG.SelectedItem); 
      } 
     } 

することができます誰も.....

+0

:あなたはそれを表示したくない場合は、CanUserAddRowsFalseに設定してください。データがない場合、なぜ削除ボタンで空の行を表示して削除するのですか? –

+0

これは型キャストに関連しています。あなたは、行が空ですが、 'if(calendarmstrDG.SelectedItem!= null)'と書いていますので、この行のエラーが発生したために機能しないと思います。 'models.Remove((pojo)calendarmstrDG.SelectedItem); '最後に、calendarmstrDG.SelectedItem型がpojo型と同じでないため、別の型にキャストできないため、コードを再度チェックします。 –

+0

@AminSaadatiこのデータグリッドの行はユーザ入力フィールドなので、ページが読み込まれると自動的に最初の行が有効になります...行セルに何かを書き始めたときにエラーをスローしません...空行上記のエラーが表示されます。 – Markz

答えて

0

コレクションからアイテムを削除すると、変更はDataGriに反映されませんあなたのコレクションがINotifyCollectionChangedを実装していない限り、d。このインターフェイスを実装するWPFの唯一のコレクションはObservableCollectionです。

ここでは、アイテムをDataGridから消える方法の例を示します。

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Id" Binding="{Binding Id}"/> 
     <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> 
     <DataGridTemplateColumn Header="Delete"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <Button Content="Delete" Tag="{Binding}" Click="OnDeleteClient"/> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 

C#クラス

class Client 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

XAMLは、ここにトリックです:我々はそれを容易に取得する私たちを可能にするボタンに全体Clientクラスを(あなたがわかるように)バインド。 なぜバインディングですか?あなたのコードでは、押されたボタンの行は選択できません。 DataGridの削除

private void OnFillDataGrid(object sender, RoutedEventArgs e) 
{ 
    clients = new ObservableCollection<Client> 
    { 
     new Client{Id = 1, Name = "Name1"}, 
     new Client{Id = 2, Name = "Name2"} 
    }; 
    dataGrid.ItemsSource = clients; 
} 

private void OnDeleteClient(object sender, RoutedEventArgs e) 
{ 
    var button = (Button)sender; 
    var client = (Client)button.Tag; 
    clients.Remove(client); 
} 

を充填

空の行は、新しいレコードのためにそこにあります。あなたがデータグリッドにいくつかのデータを結合されることがあります

<DataGrid x:Name="dataGrid" AutoGenerateColumns="False" CanUserAddRows="False"> 
+0

この参照を適用した後、私は同じエラーメッセージを受け取りました... – Markz

+0

@Markz Pardon、どちらの参照?私はこのコードをテストしました。クライアントはDataGridから正常に削除されています:) – JohnyL

+0

行にsomethigを入力した場合、削除されます。空の行を削除すると同じエラーが表示されます。 – Markz

関連する問題