DataGridTextColumn Readonly 行為,類似 TextBox

本文关键字:類似 TextBox 行為 Readonly DataGridTextColumn | 更新日期: 2023-09-27 18:36:03

我需要一种方法让 DataGridTextColumn 的只读行为类似于文本框的只读:

如果文本框是只读的,则可以单击字段并选择文本,然后单击鼠标右键即可获得上下文菜单。

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

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

提前感谢!!

DataGridTextColumn Readonly 行為,類似 TextBox

改用 DataGridTemplateColumn,并将一个现成的 TextBox 作为数据模板。

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

最好的办法是使用 EditControlShow 事件。在下面的代码中,有一个 2 列的数据网格添加到窗体中。两者都是基本的文本框列。通过附加 EditControlShowing 事件,可以修改所使用的 Editing 控件的属性。
在此示例中,如果控件为列 1(值 col),我将控件设置为只读,并为列 0 设置读写。
请注意,EditControl 实际上是一个 DataGridViewTextBoxEditControl,它是 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;
    }
}