C# DataGridTextColumn只读行为,如TextBox

C# DataGridTextColumn只读行为,如TextBox,c#,wpf,datagrid,C#,Wpf,Datagrid,我需要一种方法让DataGridTextColumn的readonly行为与textbox的行为类似: 如果文本框为只读,则可以在字段中单击并选择文本,然后使用右键单击创建上下文菜单 如果DataGridTextColumn为只读,则无法单击并选择单词,并且没有上下文菜单 我想要看起来像DataGridTextColumn,如何解决我的问题 提前谢谢 您的最佳选择是使用EditingControlShowing事件。在下面的代码中,表单中添加了一个2列的datagrid。两者都是基本的文本框列。

我需要一种方法让DataGridTextColumn的readonly行为与textbox的行为类似:

如果文本框为只读,则可以在字段中单击并选择文本,然后使用右键单击创建上下文菜单

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

我想要看起来像DataGridTextColumn,如何解决我的问题


提前谢谢

您的最佳选择是使用EditingControlShowing事件。在下面的代码中,表单中添加了一个2列的datagrid。两者都是基本的文本框列。通过附加EditingControlShowing事件,您可以修改所用编辑控件的属性。
在本例中,我将控件设置为只读,如果它是第1列(值col),则为第0列设置为读写。
记住EditingControl实际上是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;
    }
}
公共部分类表单2:表单
{
类项目
{
公共字符串标签{get;set;}
公共字符串值{get;set;}
}
DataGridView(dgv);
公共表格2()
{
初始化组件();
_dgv=新的DataGridView();
_dgv.EditingControlShowing+=新数据网格视图EditingControlShowingEventHandler(dgv_EditingControlShowing);
_dgv.DataSource=GetData();
控件。添加(_dgv);
}
void dgv_EditingControlShowing(对象发送方,DataGridViewEditingControlShowingEventArgs e)
{
var dgv=(DataGridView)发送方;
如果(例如,控件是文本框)
{
var tb=(文本框)e.Control;
tb.ReadOnly=(dgv.CurrentCell.ColumnIndex==1);
}
}
私有BindingList GetData()
{
var result=new BindingList();
添加(新项{Label=“Lbl 1”,Value=“Val 1”});
添加(新项{Label=“Lbl 2”,Value=“Val 2”});
添加(新项{Label=“Lbl 3”,Value=“Val 3”});
返回结果;
}
}

改用DataGridTemplateColumn,并将一个仅准备就绪的文本框作为数据模板

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