DataGridTextColumn Readonly 行為,類似 TextBox
本文关键字:類似 TextBox 行為 Readonly DataGridTextColumn | 更新日期: 2023-09-27 18:36:03
我需要一种方法让 DataGridTextColumn 的只读行为类似于文本框的只读:
如果文本框是只读的,则可以单击字段并选择文本,然后单击鼠标右键即可获得上下文菜单。
如果 DataGridTextColumn 是只读的,则无法单击并选择单词,并且没有上下文菜单。
我想要看起来像DataGridTextColumn,如何解决我的问题?
提前感谢!!
改用 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;
}
}