简体   繁体   English

组行上的DevExpress GridHitInfo

[英]DevExpress GridHitInfo on group row

I have drawn a checkbox in devexpress grid group row using the code below. 我已使用以下代码在devexpress网格组行中绘制了一个复选框。

using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Drawing;
using DevExpress.Utils.Drawing;
using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraEditors.ViewInfo
using DevExpress.XtraEditors.Drawing;
//...
void gvWorkspaces_CustomDrawGroupRow(object sender, RowObjectCustomDrawEventArgs e) {
    GridGroupRowPainter groupRowPainter = (GridGroupRowPainter)e.Painter;
    GridGroupRowInfo info = (GridGroupRowInfo)e.Info;
    groupRowPainter.DrawGroupRowBackground(info);
    groupRowPainter.DrawObject(info);
    Rectangle checkRect = info.ButtonBounds;
    checkRect.X = e.Bounds.Right - checkRect.Width -4;
    DrawCheckBox(e.Graphics, checkRect, true);
    e.Handled = true;
}
void DrawCheckBox(Graphics graphics, Rectangle r, bool Checked) {
    RepositoryItemCheckEdit edit = new RepositoryItemCheckEdit();
    CheckEditViewInfo info = (CheckEditViewInfo)edit.CreateViewInfo();
    info.EditValue = Checked;
    info.Bounds = r;
    info.CalcViewInfo(graphics);

    CheckEditPainter painter = (CheckEditPainter)edit.CreatePainter();
    ControlGraphicsInfoArgs args = new ControlGraphicsInfoArgs(info, new GraphicsCache(graphics), r);
    painter.Draw(args);
    args.Cache.Dispose();
}

However, I am having challenges in accessing the checkbox to tick and untick. 但是,我在访问复选框打勾和取消勾号时遇到了挑战。

I tried to use GridHitInfo in GridView click event (as below). 我试图在GridView click事件中使用GridHitInfo(如下所示)。 But I am not getting anything that could help me to access the checkbox. 但是我没有得到任何可以帮助我访问该复选框的信息。

void gvWorkspaces_Click(object sender, EventArgs e) {
    GridView view = (GridView)sender;
    Point pt = view.GridControl.PointToClient(Control.MousePosition);
    GridHitInfo info = view.CalcHitInfo(pt);
}

Any help would be appreciated. 任何帮助,将不胜感激。

Thanks 谢谢

Balan 巴兰

You should use the following approach: 您应该使用以下方法:

RepositoryItemCheckEdit edit;
CheckEditViewInfo editInfo;
CheckEditPainter editPainter;
//...
    edit = new RepositoryItemCheckEdit();
    editInfo = (CheckEditViewInfo)edit.CreateViewInfo();
    editPainter = (CheckEditPainter)edit.CreatePainter();
}
Hashtable checkedRows = new Hashtable();
Hashtable editorRects = new Hashtable();
void gvWorkspaces_Click(object sender, EventArgs e) {
    GridView view = (GridView)sender;
    Point pt = view.GridControl.PointToClient(Control.MousePosition);
    GridHitInfo info = view.CalcHitInfo(pt);
    if(info.InRow) {
        Rectangle editorRect = (Rectangle)editorRects[info.RowHandle];
        if(editorRect.Contains(pt)) {
            object value = checkedRows[info.RowHandle]; 
            if(value == null)
                checkedRows[info.RowHandle] = true;
            else checkedRows.Remove(info.RowHandle);
            view.GridControl.Invalidate(editorRect);
        }
    }
}
void gvWorkspaces_CustomDrawGroupRow(object sender, RowObjectCustomDrawEventArgs e) {
    e.Painter.DrawObject(e.Info);
    GridGroupRowInfo info = (GridGroupRowInfo)e.Info;
    Rectangle checkRect = info.ButtonBounds;
    checkRect.X = e.Bounds.Right - checkRect.Width - 4;
    DrawCheckEdit(e.Graphics, checkRect, checkedRows[e.RowHandle] != null);
    editorRects[e.RowHandle] = checkRect; // cache rectangle
    e.Handled = true;
}
void DrawCheckEdit(Graphics graphics, Rectangle r, bool cheched) {
    editInfo.EditValue = cheched;
    editInfo.Bounds = r;
    editInfo.CalcViewInfo(graphics);
    using(GraphicsCache cache = new GraphicsCache(graphics)) {
        editPainter.Draw(new ControlGraphicsInfoArgs(editInfo, cache, r));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM