2016-08-20 1 views
-1

Я привязал данные к данным (которые заполнены во время выполнения) к моему datagrid и имеет один столбец, в котором перечислены пути файлов. Я настраиваю этот столбец, чтобы заменить путь к файлу кнопкой изображения, чтобы открыть файл при нажатии. Я получаю следующую ошибку, но не смог ее решить. Любое направление будет принята с благодарностью!Необработанное исключение при событии с нажатием кнопки

Ошибка: Необработанное исключение типа «Microsoft.CSharp.RuntimeBinder.RuntimeBinderException» произошло в System.Core.dll Дополнительная информация: «System.Data.DataRowView» не содержит определения для «Master»

Я получаю сообщение об ошибке на событии моей кнопки ... "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:

<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

Ошибка кажется достаточно ясной. Ваш код предполагает, что объект имеет свойство «Мастер», но это не так. Но вы не предоставили хороший [mcve], который четко показывает контекст этого кода и то, что вы могли бы подразумевать, вместо того, чтобы пытаться получить свойство «Мастер». Возможно, вы можете добавить свойство «Мастер», как было предложено, возможно, нет. Невозможно знать без лучшего примера кода. –

ответ

-1

Проблема «string filepath = d.Master;». d имеет тип DataRowView, который не имеет свойства, называемого Master. Измените динамику на var, и она не сработает во время компиляции, а не во время выполнения.

+0

Это не кажется мне ответом. Изменение исключения в ошибке времени компиляции не решает проблему. Он просто двигает. (Совет также не так полезен в любом случае: 'DataContext' имеет тип' object', так что 'var' будет терпеть неудачу во время компиляции, но не так, чтобы что-то вам рассказывало. Оно потерпит неудачу, даже если' dynamic' _didn 't_.) –

+0

Ответ - второе предложение. d имеет тип DataRowView, который не имеет свойства Master – Carmine

+0

Все, что делает, повторяет сообщение об ошибке. Это говорит так же. Как это решает вопрос автора _problem_? –

0

Почему вы пытаетесь получить неопределенный Master с DataContext? т.е. почему ошибка идет.

С fileTable является источником вашей сетки данных, вам необходимо указать элемент Master в типе данных fileTable. Поскольку он еще не определен, будет произведена ошибка.

Лучшее решение состоит в том, чтобы иметь свойство Master в классе данных вашего ItemsSource и соответствующим образом заполнить его, чтобы во время нажатия кнопки вы могли получить к нему доступ через DataContext, как то, как вы сейчас делаете.

0

Спасибо всем, что указал мне в правильном направлении. Я думал, что DataContext указывает мне на столбец «Мастер» данных, который генерируется во время выполнения, а не в качестве истинного свойства. Вместо этого я исправил свою проблему, указав выбранную ячейку.

 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); 
     } 
Смежные вопросы