前幾天,公司同事有個需求需要對系統中的DataGrid控制項的指定單元格(如圖,申請人ID)進行禁用設置,嘗試了很多次總是 整行整列的 禁用 沒實現效果。 網上資料較少,沒找到解決措施。 儘管silverlight的datagrid控制項和 asp.net的名字相同,但很多方面還是不大一樣的。 但是換個
前幾天,公司同事有個需求需要對系統中的DataGrid控制項的指定單元格(如圖,申請人ID)進行禁用設置,嘗試了很多次總是 整行整列的 禁用 沒實現效果。 網上資料較少,沒找到解決措施。
儘管silverlight的datagrid控制項和 asp.net的名字相同,但很多方面還是不大一樣的。
但是換個思維方式, 任何事務都是由對象 構成,Asp.net中的datagrid的單元格是cell對象,所以 silverlight的單元格 應該也是 一個對象,一種類型,可以通過一些方法被獲取到。
多次嘗試後通過以下的 代碼方案簡單明瞭的 找到了 目標條件的 單元格 DataGridCell對象。
前端xaml代碼:
1 <sdk:DataGrid x:Name="dataGrid" SelectionMode="Single" Grid.Row="1" Margin="-1,-1,-1,0" CopyingRowClipboardContent="dataGrid_CopyingRowClipboardContent" 2 AutoGenerateColumns="False" VerticalContentAlignment="Stretch" Loaded="dataGrid2_Loaded" 3 HorizontalContentAlignment="Stretch" Grid.ColumnSpan="2" CellEditEnded="dataGrid_CellEditEnded" 4 ColumnHeaderStyle="{StaticResource DataGridHeaderStyle}" LoadingRow="dataGrid_LoadingRow" BeginningEdit="dataGrid_BeginningEdit" 5 CurrentCellChanged="dataGrid_CurrentCellChanged"> 6 <sdk:DataGrid.Columns> 7 <sdk:DataGridTemplateColumn Width="100" Header="查詢對象"> 8 <sdk:DataGridTemplateColumn.CellTemplate> 9 <DataTemplate> 10 <TextBlock Height="20" Margin="2,0" VerticalAlignment="Center" HorizontalAlignment="Left" 11 Text="{Binding QueryType, Converter={StaticResource QueryTypeConverter}, Mode=TwoWay}" /> 12 </DataTemplate> 13 </sdk:DataGridTemplateColumn.CellTemplate> 14 <sdk:DataGridTemplateColumn.CellEditingTemplate> 15 <DataTemplate> 16 <ComboBox ItemsSource="{Binding KeyNameList, Source={StaticResource QueryTypeConverter}}" 17 SelectedItem="{Binding QueryType, Converter={StaticResource QueryTypeConverter}, Mode=TwoWay}"/> 18 </DataTemplate> 19 </sdk:DataGridTemplateColumn.CellEditingTemplate> 20 </sdk:DataGridTemplateColumn> 21 <sdk:DataGridTextColumn Width="0.3*" Header="查詢內容" Binding="{Binding Content}"/> 22 23 <sdk:DataGridTemplateColumn Width="70" Header="有無異常"> 24 <sdk:DataGridTemplateColumn.CellTemplate> 25 <DataTemplate> 26 <TextBlock Margin="2,0" VerticalAlignment="Center" HorizontalAlignment="Left" 27 Text="{Binding ResultDesc, Converter={StaticResource IsResultDescConverter}, Mode=TwoWay}" /> 28 </DataTemplate> 29 </sdk:DataGridTemplateColumn.CellTemplate> 30 <sdk:DataGridTemplateColumn.CellEditingTemplate> 31 <DataTemplate> 32 <ComboBox ItemsSource="{Binding KeyNameList, Source={StaticResource IsResultDescConverter}}" 33 SelectedItem="{Binding ResultDesc, Converter={StaticResource IsResultDescConverter}, Mode=TwoWay}" 34 Height="25"/> 35 </DataTemplate> 36 </sdk:DataGridTemplateColumn.CellEditingTemplate> 37 </sdk:DataGridTemplateColumn> 38 <!--<sdk:DataGridTextColumn Width="0.7*" Header="備註" Binding="{Binding Path=Remark}"/>--> 39 <sdk:DataGridTemplateColumn Width="0.7*" Header="備註"> 40 <sdk:DataGridTemplateColumn.CellTemplate> 41 <DataTemplate> 42 <TextBlock Text="{Binding Remark}" TextWrapping="Wrap" VerticalAlignment="Center"/> 43 </DataTemplate> 44 </sdk:DataGridTemplateColumn.CellTemplate> 45 <sdk:DataGridTemplateColumn.CellEditingTemplate> 46 <DataTemplate> 47 <TextBox Text="{Binding Remark, Mode=TwoWay}" AcceptsReturn="True" TextWrapping="Wrap"/> 48 </DataTemplate> 49 </sdk:DataGridTemplateColumn.CellEditingTemplate> 50 </sdk:DataGridTemplateColumn> 51 <sdk:DataGridTemplateColumn Width="45" Header="操作"> 52 <sdk:DataGridTemplateColumn.CellTemplate> 53 <DataTemplate> 54 <StackPanel Orientation="Horizontal" Height="22"> 55 <Image x:Name="btnAdd" ToolTipService.ToolTip="新增" MouseLeftButtonUp="btnAdd_MouseLeftButtonUp" Source="/CTOP2P;component/Assets/Image/Action_LinkUnlink_Link.png" Style="{StaticResource imgButton}"/> 56 <Image x:Name="btnCopy" Visibility="Collapsed" ToolTipService.ToolTip="複製" MouseLeftButtonUp="btnCopy_MouseLeftButtonUp" Source="/CTOP2P;component/Assets/Image/Action_Copy.png" Style="{StaticResource imgButton}"/> 57 <Image x:Name="btnDel" ToolTipService.ToolTip="刪除" MouseLeftButtonUp="btnDel_MouseLeftButtonUp" Cursor="Hand" Source="/CTOP2P;component/Assets/Image/Action_Delete_12x12.png" Height="12" Width="12" Margin="2,0"/> 58 </StackPanel> 59 </DataTemplate> 60 </sdk:DataGridTemplateColumn.CellTemplate> 61 </sdk:DataGridTemplateColumn> 62 </sdk:DataGrid.Columns> 63 </sdk:DataGrid>View Code
需要設置dataGrid_BeginningEdit事件。
後端代碼:
private void dataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e) {
var item = e.Row.DataContext as AuditQueryInfo;
if (item.QueryType.Equals("申請人ID")) {
var dataGrid = sender as DataGrid;
FrameworkElement fe = dataGrid.Columns[1].GetCellContent(item);
if (fe == null)
return;
FrameworkElement result = GetParent(fe, typeof(DataGridCell));
if (fe != null) {
DataGridCell cell = (DataGridCell)result;
cell.Foreground = new SolidColorBrush(Colors.Green);
cell.IsEnabled = false;
}
}
}
View Code
private FrameworkElement GetParent(FrameworkElement child, Type targetType) {
object parent = child.Parent;
if (parent != null) {
if (parent.GetType() == targetType) {
return (FrameworkElement)parent;
} else {
return GetParent((FrameworkElement)parent, targetType);
}
}
return null;
}
這樣就能對指定條件的單元格進行獲取操作了。
相關資料:
http://blog.csdn.net/jhqin/article/details/7645357/