2017-12-26 38 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이 datagrid 행은 사용자 입력 필드이므로 페이지가로드 될 때 datadrig가 자동으로 첫 번째 행을 활성화합니다 ... 행 셀에 무언가를 쓸 때 오류가 발생하지 않습니다. 빈 행 그것은 내가 위에서 언급 한 오류를 보여줍니다 .. – Markz

답변

0

컬렉션에서 항목을 삭제하면 변경 사항이 DataGri에 반영되지 않습니다. 당신의 컬렉션이 INotifyCollectionChanged를 구현하지 않는다면 d. 이 인터페이스를 구현하는 WPF의 유일한 컬렉션은 ObservableCollection입니다.

다음은 DataGrid에서 항목을 사라지게 만드는 방법의 예입니다.

C# 클래스

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

XAML 여기

<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> 

는 트릭 : 우리는 (당신이 볼 수로) 쉽게 검색 할 수있게 해준다 버튼에 전체 클라이언트 클래스를 바인딩 . 왜 바인딩이 필요합니까? 코드에서 눌려진 버튼 이있는 행은을 선택할 수 없기 때문에.

는 데이터 그리드 및 삭제

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, which reference?이 코드를 테스트 한 결과 - 클라이언트가 DataGrid에서 성공적으로 삭제되었습니다. – JohnyL

+0

행에 somethig를 입력하면 삭제된다는 의미입니다 ... 빈 행을 삭제하면 동일한 오류가 표시됩니다. – Markz