我需要一种方法让DataGridTextColumn的readonly行为类似于文本框的那些:
如果文本框是只读的,您可以单击该字段并选择文本并右键单击上下文菜单。
如果只读取DataGridTextColumn,则无法单击并选择单词,并且您没有上下文菜单。
我希望看起来像DataGridTextColumn,我该如何解决我的问题?
提前致谢!!
答案 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;
}
}