这篇文章上次修改于 760 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
var colOperation = gvAppointSchedule.Columns.AddField("操作");
colOperation.Name = "colOperation";
colOperation.VisibleIndex = gvAppointSchedule.Columns.Count;
colOperation.UnboundType = UnboundColumnType.String;
colOperation.Width = 60;
colOperation.OptionsColumn.AllowSize = false;

var riButtonEdit = new RepositoryItemButtonEdit();
riButtonEdit.TextEditStyle = TextEditStyles.HideTextEditor;
riButtonEdit.Buttons[0].Kind = ButtonPredefines.Glyph;
riButtonEdit.Buttons[0].Caption = "预约";
riButtonEdit.Buttons[0].Image = Resources.预约;

gcAppointSchedule.RepositoryItems.Add(riButtonEdit);
colOperation.ColumnEdit = riButtonEdit;

按钮列倒是添加成功了,按钮单击事件的触发才是个大问题。

如果单纯的使用 riButtonEdit.ButtonClick 来绑定事件,需要将 GridViewOptionsBehavior.Editable 设置为 true,否则不会触发 ButtonClick 事件。如果其他列不需要 Editable 那么只有单独设置每一列的 OptionsColumn.AllowEditfalse

这样能解决问题也挺好,可是又遇到了新问题。如果焦点没在按钮单元格,那么需要点击两次才会触发 ButtonClick 事件,第一次点击获取到焦点,第二次点击才会触发 ButtonClick 事件????。

网上有人说将 GridViewOptionsBehavior.EditorShowMode 设为 EditorShowMode.MouseDown 就可以单击触发事件,但我设了以后还是不行,不知道是不是姿势不对。

最后我采取的方案是,不使用按钮列的 ButtonClick 事件,而是使用单元格的 RowCellClick 事件,如下所示:

private void gvAppointSchedule_RowCellClick(object sender, RowCellClickEventArgs e)
{
    if (e.Column.Name == "colOperation")
    {
        Debug.WriteLine("RiButtonEdit_ButtonClick");
    }
}

完美解决!