DataGridTextColumn像TextBox一样的只读行为

时间:2015-01-04 15:04:08

标签: c# wpf datagrid

我需要一种方法让DataGridTextColumn的readonly行为类似于文本框的那些:

如果文本框是只读的,您可以单击该字段并选择文本并右键单击上下文菜单。

如果只读取DataGridTextColumn,则无法单击并选择单词,并且您没有上下文菜单。

我希望看起来像DataGridTextColumn,我该如何解决我的问题?

提前致谢!!

2 个答案:

答案 0 :(得分:2)

改为使用DataGridTemplateColumn,并将只读TextBox作为数据模板。

<DataGridTemplateColumn Header="My Property" IsReadyOnly="True" SortMemberPath="MyProperty">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Text="{Binding MyProperty}" IsReadOnly="True"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

答案 1 :(得分:1)

您最好的选择是使用EditingControlShowing事件。在下面的代码中,表单中添加了一个2列数据网格。两者都是基本的文本框列。通过附加EditingControlShowing事件,您可以修改所使用的编辑控件的属性 在此示例中,我将控件设置为只读(如果它的第1列(值col)和读取写入第0列。 请注意,EditingControl实际上是DataGridViewTextBoxEditingControl,是TextBox的子类。

public partial class Form2 : Form
{
    class Item
    {
        public string Label { get; set; }
        public string Value { get; set; }
    }

    DataGridView _dgv;

    public Form2()
    {
        InitializeComponent();

        _dgv = new DataGridView();
        _dgv.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(dgv_EditingControlShowing);
        _dgv.DataSource = GetData();

        Controls.Add(_dgv);
    }

    void dgv_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        var dgv = (DataGridView)sender;
        if (e.Control is TextBox)
        {
            var tb = (TextBox)e.Control;
            tb.ReadOnly = (dgv.CurrentCell.ColumnIndex == 1);
        }
    }

    private BindingList<Item> GetData()
    {
        var result = new BindingList<Item>();
        result.Add(new Item { Label = "Lbl 1", Value = "Val 1" });
        result.Add(new Item { Label = "Lbl 2", Value = "Val 2" });
        result.Add(new Item { Label = "Lbl 3", Value = "Val 3" });
        return result;
    }
}