我是C#初学者并在How do I make a DataGridView immediately commit edits?下载了扩展方法。该方法效果很好,但不理解语法。
我的问题是要在两行上解释语法。
第1行:gv.CurrentCellDirtyStateChanged += (sender, args) =>
什么是+=
和=>
?
第二行:};
为什么这里需要分号?
public static void ChangeEditModeToOnPropertyChanged(this DataGridView gv)
{
gv.CurrentCellDirtyStateChanged += (sender, args) =>
{
gv.CommitEdit(DataGridViewDataErrorContexts.Commit);
if (gv.CurrentCell == null)
return;
if (gv.CurrentCell.EditType != typeof(DataGridViewTextBoxEditingControl))
return;
gv.BeginEdit(false);
var textBox = (TextBox)gv.EditingControl;
textBox.SelectionStart = textBox.Text.Length;
};
}
答案 0 :(得分:0)
你看到的是一个Lambda表达式。 Lambda Expression是一种非常简洁的语法,用于方法的内联定义,即所谓的匿名委托。
而不是宣布......
private void Cell_StateChanged(object sender, EventArgs args)
{
some code;
}
......和事件声明......
gv.CurrentCellDirtyStateChanged += Cell_StateChanged;
......你写的
gv.CurrentCellDirtyStateChanged += (sender, args) => { some code; };
=>
之前的部分(发音为“转到”)是参数列表。不需要声明类型,因为它们是从事件CurrentCellDirtyStateChanged
的声明中推断出来的。
=>
右边的部分是方法体。
末尾的分号与gv.CurrentCellDirtyStateChanged += Cell_StateChanged;
中的分号相同。
如果只有一个声明,你甚至可以放下大括号:
gv.CurrentCellDirtyStateChanged += (sender, args) => Print(args);
Lambda表达式也可用于函数方法:
Func<double, double> f = x => x * x; // You can drop the () if there is only 1 argument
此处x => x * x
执行与
private double Square(double x)
{
return x * x;
}
作业Func<double, double> f = x => x * x;
和Func<double, double> f = Square;
是等效的。所以
double y = f(3);
// y = 9
我还没有解释+=
。此运算符用于将事件处理程序附加到事件。在VB中你会更明确地写
AddHandler gv.CurrentCellDirtyStateChanged, AddressOf Cell_StateChanged
答案 1 :(得分:0)
要获得整体解释,所有方法都会将DataGridView
上的事件分配给匿名函数(lambda表达式)。
现在的语法:
+=
正在向右边的事件添加操作数。事件是多播委托,因此一个事件调用可以触发多个函数(因此&#34; + =&#34;而不是&#34; =&#34;,您将添加到列表中)。
=>
是lambda语法的一部分。通常,lambda看起来像(<args>) => { expressions }
。有简写版本,但您的示例遵循此语法。在英语中,我们说&#34;这样&#34;遇到此符号时。
在lambda表达式的结束;
之后有一个}
,因为您正在完成一个语句,即对事件的赋值。