WPF DataGridTextColumn列如何让其中的单元格不可编辑

maxldwy 2013-03-28 03:51:19

代码是 <DataGrid>
<DataGrid.Columns>
<DataGridTextColumn Header="NAME" Width="*" Binding="{Binding Name}">
<DataGridTextColumn Header="TYPE" Width="*" Binding="{Binding Type}"/>
<DataGridTextColumn Header="VALUE" Width="*" Binding="{Binding Value}"/>
<DataGridTextColumn Header="RANGE" Width="*" Binding="{Binding Range}"/>
</DataGrid>
</DataGrid.Columns>想各位大侠都懂...就是想去掉NAME TYPE RANGE列的编辑功能,让它们不能被编辑,只保留下VALUE列,让此列下的单元格可以输入文本,应该怎么搞?
求教!!!!!!
...全文
5339 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
小白hk 2014-05-09
  • 打赏
  • 举报
回复
引用 19 楼 maxldwy 的回复:
真的可以了啊~谢谢了 大侠 以后多多指教~
请问下,我是小小白,你的Value那一列,怎么修改的,是定义了 BeginningEdit="dg_BeginningEdit" CellEditEnding="dg_CellEditEnding"方法吗,能否接我参考下~感谢
maxldwy 2013-03-29
  • 打赏
  • 举报
回复
<Window x:Class="WPF.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="380" Width="603" xmlns:converters="clr-namespace:WPF" > <Window.Resources> <converters:Type2Bool x:Key="Type2Bool"/> </Window.Resources> <Grid Width="567" Height="290"> <Grid.ColumnDefinitions> <ColumnDefinition Width="540*" /> <ColumnDefinition Width="20*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="6*" /> <RowDefinition Height="30*" /> <RowDefinition Height="0*" /> <RowDefinition Height="254*" /> </Grid.RowDefinitions> <DataGrid AutoGenerateColumns="False" Height="218" ItemsSource="{Binding}" HorizontalAlignment="Left" Margin="22,6,0,0" Name="dgIndicators" VerticalAlignment="Top" Width="519" CellEditEnding="dgIndicators_CellEditEnding" IsReadOnly="{Binding}" CanUserSortColumns="False" CanUserAddRows="False" Grid.RowSpan="3" Grid.Row="1"> <DataGrid.Columns> <DataGridTextColumn IsReadOnly="true" Header="NAME" Width="*" Binding="{Binding Name}"> </DataGridTextColumn> <DataGridTextColumn IsReadOnly="true" Header="TYPE" Width="*" Binding="{Binding Type}"/> <DataGridTextColumn Header="VALUE" Width="*" Binding="{Binding Value}" IsReadOnly="{Binding Type, Converter={StaticResource Type2Bool}}"/> <DataGridTextColumn IsReadOnly="true" Header="RANGE" Width="*" Binding="{Binding Range}"/> <DataGridTemplateColumn Header="Button" Width="*"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <Button Click="button_Click" Command="{Binding Path=Edit}" Content="{Binding ButtonName}"/> </DataTemplate> </DataGridTemplateColumn.CellTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid> <Button Content="保 存" Grid.Row="3" Height="27" HorizontalAlignment="Left" Margin="469,220,0,0" Name="button1" VerticalAlignment="Top" Width="72" Click="button1_Click" Grid.ColumnSpan="2" /> </Grid> </Window>
ariesget 2013-03-29
  • 打赏
  • 举报
回复
看下你XAML里是怎么写的。没绑定对吧。最简单就是别自己写了,绑定用鼠标一路点下去。
maxldwy 2013-03-29
  • 打赏
  • 举报
回复
好像根本没执行那段方法?设了断点根本没用,这是我WPF的命名空间 namespace WPF { class Type2Bool : IValueConverter { #region IValueConverter Members public object Convert(object Value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return (string)Value == "Image"; } public object ConvertBack(object Value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } #endregion } public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); 。。。。省略点程序... }
ariesget 2013-03-29
  • 打赏
  • 举报
回复
你在那个类里设断点跟踪一下value的实际类型是啥。然后再做判断
maxldwy 2013-03-29
  • 打赏
  • 举报
回复
我DataGridTextColumn文本里绑定的是从数据库中读取出来的数据 Image就是string字符串,VALUE列是想让它在上面可以打数据然后保存进数据库中,只是Image行是存图片二进制码的 所以 不需要它可以被编辑 想去掉那特定单元格的 编辑属性
ariesget 2013-03-29
  • 打赏
  • 举报
回复
return (string)value == "Image"; 改成你的判断。 return (你的对象类型)value.tostring() == "Image"; 把你绑定的对象类型发上来看下。
ariesget 2013-03-29
  • 打赏
  • 举报
回复
引用 10 楼 maxldwy 的回复:
可以运行了 但是 这个方法好像没用啊 VALUE列的 Image行还是可以编辑啊
你得看你的Type绑定的那个对象是啥。然后判断。我这里是猜你绑定的是一个string。你自己看下是啥呗。然后再改下方法里的判断
maxldwy 2013-03-29
  • 打赏
  • 举报
回复
可以运行了 但是 这个方法好像没用啊 VALUE列的 Image行还是可以编辑啊
ariesget 2013-03-29
  • 打赏
  • 举报
回复
你的Type2Bool类是在这个命名空间么?是的话直接运行一次就可以了
maxldwy 2013-03-29
  • 打赏
  • 举报
回复

真是不好意思啊 我菜鸟 还是有点问题怎么回事呢?
ariesget 2013-03-29
  • 打赏
  • 举报
回复
引用 5 楼 maxldwy 的回复:
引用 4 楼 ariesget 的回复:<DataGridTextColumn Header="VALUE" Width="*" Binding="{Binding Value}" IsReadOnly="{Binding Type,Converter={StaticResource Type2Bool}}"/> C# code?123456789101112131……
首先得在XAML里引入你的命名空间,把Type2Bool类定义成资源 类似这样

<Window x:Class="Client.AdvanceSearch"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:converters="clr-namespace:你的类命名空间"
        <Window.Resources>
            <converters:Type2Bool x:Key="Type2Bool"/>
        </Window.Resources>
        ....
        <DataGridTextColumn Header="VALUE" Width="*" Binding="{Binding Value}" IsReadOnly="{Binding Type,Converter={StaticResource Type2Bool}}"/>
        ....
          
maxldwy 2013-03-29
  • 打赏
  • 举报
回复
说未能解析源Type2Bool
maxldwy 2013-03-29
  • 打赏
  • 举报
回复
引用 4 楼 ariesget 的回复:
<DataGridTextColumn Header="VALUE" Width="*" Binding="{Binding Value}" IsReadOnly="{Binding Type,Converter={StaticResource Type2Bool}}"/>

C# code?12345678910111213141516class Type2Bool……

首先谢谢大哥了啊 我昨天有点事没看论坛不好意思 记得上次我的帖子也是你回复的 真的谢谢你了
那个语句有点问题啊
maxldwy 2013-03-29
  • 打赏
  • 举报
回复
真的可以了啊~谢谢了 大侠 以后多多指教~
ariesget 2013-03-29
  • 打赏
  • 举报
回复
刚自己试了下。确实有问题。然后再MSDN查了下貌似是说DataGridTextColumn这个控件不是一个真正的Visual所以IsReadOnly的属性绑定没用。所以我这边稍微改了下用DataGridTemplateColumn代替。你试下这个替换掉<DataGridTextColumn Header="VALUE" Width="*" Binding="{Binding Value}" IsReadOnly="{Binding Type, Converter={StaticResource Type2Bool}}"/>这行。


                  <DataGridTemplateColumn  Header="VALUE" Width="*" >
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <TextBox IsReadOnly="{Binding Type,Converter={StaticResource type2Bool}}" Text="{Binding Value}" BorderThickness="0" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>

ariesget 2013-03-28
  • 打赏
  • 举报
回复
<DataGridTextColumn Header="VALUE" Width="*" Binding="{Binding Value}" IsReadOnly="{Binding Type,Converter={StaticResource Type2Bool}}"/>

class Type2Bool : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (string)value == "Image";
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
ariesget 2013-03-28
  • 打赏
  • 举报
回复
IsReadOnly绑定Type 然后写个IValueConverter对Type进行判断
maxldwy 2013-03-28
  • 打赏
  • 举报
回复
引用 1 楼 DENQH 的回复:
设列的IsReadOnly="true“
谢谢 大神真的有用啊 我想多问一个问题 就是让VALUE列的所有跟TYPE列值为Image的那一行的单元格也不能编辑应该怎么写?真是谢谢你了
DENQH 2013-03-28
  • 打赏
  • 举报
回复
设列的IsReadOnly="true“

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧