2016-08-20 2 views
-1

런타임에 채워지는 datatable을 데이터 그리드에 바인딩하고 파일 경로를 나열하는 하나의 열을 바인딩했습니다. 나는이 열을 사용자 정의하여 파일 경로를 이미지 버튼으로 바꾸어 클릭 할 때 파일을 엽니 다. 다음 오류가 표시되지만 해결할 수 없습니다. 모든 방향은 크게 감사하겠습니다!버튼 클릭 이벤트에 대한 처리되지 않은 예외

오류 : 타입 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'의 처리되지 않은 예외가 System.Core.dll에 추가 정보를 발생 'System.Data.DataRowView'는 '마스터'에 대한 정의가 포함되어 있지 않습니다

버튼 이벤트에 오류가 발생했습니다. "d.Master"

private void ButtonClick(object sender, RoutedEventArgs e) 
{ 
    Button button2 = (Button)e.OriginalSource; 
    dynamic d = button2.DataContext; 
    string filepath = d.Master; 
    Process.Start(filepath); 
} 

데이터 격자 :

<DataGrid x:Name="DataGrid1" HorizontalAlignment="Stretch" 
      Margin="650,197,449,0" VerticalAlignment="Stretch" 
      AutoGenerateColumns="True" AutoGeneratingColumn="DataGrid_AugoGeneratingColumn" ItemsSource="{Binding fileTable}"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Master" CellTemplate="{StaticResource DataTemplate2}"/> 
    </DataGrid.Columns> 
</DataGrid> 

DataTemplate을

<DataTemplate x:Key="DataTemplate2"> 
<Button Name="fileButton" Click="ButtonClick" Width="30" Height="30" BorderBrush="#FF707070" BorderThickness="1,1,0,1"> 
    <Button.Background> 
     <ImageBrush ImageSource="C:\Images\PDFicon.png" Stretch="Uniform"/> 
    </Button.Background> 
</Button> 
</DataTemplate> 

AutoGeneratingColumn 방법 :

private void DataGrid_AugoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.Column.Header.ToString() == "Master") 
    { 
     DataGridTemplateColumn templateColumn = new DataGridTemplateColumn //create new template column 
     CellTemplate = (DataTemplate) Resources["DataTemplate2"] 
     e.Column = templateColumn; // Replace the auto-generated column with the templateColumn. 
    } 
    else 
    { 
     e.Column.Header = "Expired"; 
    } 
} 
+0

오류가 분명해 보입니다. 코드에서는 객체에 'Master'속성이 있다고 가정하지만 실제로는 아닙니다. 그러나 당신은이 코드의 문맥을 명확하게 보여주는 좋은 [mcve]를 제공하지 않았으며 '마스터'속성을 얻으려고 시도하지 않고 의도했던 것만 제공했을 것입니다. 어쩌면 마스터 속성을 제안 된대로 추가 할 수 있습니다. 더 나은 코드 예제 없이는 알 수 없습니다. –

답변

-1

문제는 "string filepath = d.Master;"입니다. d는 Master라는 속성이없는 DataRowView 유형입니다. 동적 변수를 var로 변경하면 런타임 대신 컴파일 타임에 실패합니다.

+0

이것은 나에게 답장처럼 보이지 않습니다. 예외를 컴파일 타임 오류로 변경해도 문제가 해결되지 않습니다. 그냥 움직여. (조언은 어쨌든 그렇게 도움이되지 않는다;'DataContext'는 타입'object'을 가지고 있기 때문에'var'은 컴파일시에는 실패하지만 아무것도 알려주지는 않습니다 .' dynamic' _didn 't_.) –

+0

대답은 두 번째 문장입니다. d는 Master – Carmine

+0

이라는 속성이없는 DataRowView 유형입니다. 오류 메시지가 반복됩니다. 그것은 많은 것을 말한다. 그게 어떻게 저자의 _ 문제를 해결할 수 있습니까? –

0

DataContext에서 정의되지 않은 Master을 얻으려고합니까? 즉 오류가 발생하는 이유.

fileTable이 데이터 표의 원본이므로 데이터 형식에 Master 항목이 있어야합니다. 아직 정의되지 않았기 때문에 오류가 발생합니다.

가장 좋은 해결책은 ItemsSource의 데이터 클래스에 Master 속성을 포함하고 그에 따라 속성을 채우는 것입니다. 따라서 단추를 클릭하는 동안 현재 수행중인 것처럼 DataContext를 통해 액세스 할 수 있습니다.

0

감사합니다. 올바른 방향으로 나를 지적했습니다. 나는 DataContext가 datatable의 "Master"컬럼 자체를 가리키고 있다고 생각했다. 이것은 런타임에서 생성 된 것이고 진짜 속성이 아니다. 대신 선택한 셀을 식별하여 문제를 해결했습니다.

 private void ButtonClick(object sender, RoutedEventArgs e) 
    { 
     //Get column Index of selected cell & set as variable 
     int colIndex = BoundPivotGrid.CurrentCell.Column.DisplayIndex; 
     DataRowView drv = (DataRowView)BoundPivotGrid.SelectedItem; 
     String valueOfItem = drv[colIndex].ToString(); 

     if (valueOfItem == "-") 
     { 
      MessageBox.Show("No file"); 
     } 
     else 
     { 
      Process.Start(valueOfItem); 
     }