Posted 24 May 2022, 11:21 am EST - Updated 3 October 2022, 10:27 pm EST
Hi.
I more or less figured out how to add columns with buttons ot grid, but my approach only works when there is no rows with details, namely RowDetailProvider = null. Once I add child grid everything got broken, see img. below (don’t bother with button size). So as you can see, my code adds button to child’s grid rows also, hiding child’s it’s column. So, I need add button to column and preserve child grid functionality. How to do that?
Here is my code, compilation from chunks I found on this fourm,
see C1FlexGrid1_AfterDataRefresh handler:
private void LogUserControlLoad(object sender, EventArgs e)
{
c1FlexGrid1.Paint += C1FlexGrid1OnPaint;
c1FlexGrid1.AfterDataRefresh += C1FlexGrid1_AfterDataRefresh;
}
private void C1FlexGrid1_AfterDataRefresh(object sender, System.ComponentModel.ListChangedEventArgs e)
{
var colIndex = c1FlexGrid1.Cols[@"enginelog"].Index;
var i = 0;
while(i < c1FlexGrid1.Rows.Count)
{
if (i < c1FlexGrid1.Rows.Fixed)
{
i++;
continue;
}
var row = c1FlexGrid1.Rows[i];
if (row.DataSource is MyData)
{
SetupButtons(c1FlexGrid1, colIndex, c1FlexGrid1.Rows[i].Index);
}
i++;
}
}
private void C1FlexGrid1OnPaint(object sender, PaintEventArgs e)
{
foreach (ColumnButton bt in _columnBtnHs)
{
bt.UpdateButtonBounds();
}
}
private void SetupButtons(C1FlexGrid sender, int col, int row)
{
var bt = new ColumnButton(sender, row, col);
var isAdded = _columnBtnHs.Add(bt);
if(!isAdded) return;
bt.Click += EngineLogBtnClick;
bt.Text = @"View log";
}
private void EngineLogBtnClick(object sender, EventArgs e)
{
//throw new NotImplementedException();
var btn = sender as ColumnButton;
MessageBox.Show(String.Format("{0}-{1}",btn.Row,btn.Col));
}
public class ColumnButton : Button, IEqualityComparer<ColumnButton>
{
#region Constructor
public ColumnButton(C1FlexGrid flex, int row, int col)
{
Grid = flex;
Row = Grid.Rows[row];
Col = Grid.Cols[col];
Grid.Controls.Add(this);
Tag = new Point(row, col);
Paint += ColumnButton_Paint;
BackColor = Color.Aquamarine;
}
#endregion
#region Properties
internal C1FlexGrid Grid { get; }
internal Row Row { get; }
internal Column Col { get; }
#endregion
#region Methods
//paints the border of the button
private void ColumnButton_Paint(object sender, PaintEventArgs e)
{
ControlPaint.DrawBorder(e.Graphics, ((Button)sender).ClientRectangle,
Color.Green, 1, ButtonBorderStyle.Solid,
Color.Green, 1, ButtonBorderStyle.Solid,
Color.Green, 1, ButtonBorderStyle.Solid,
Color.Green, 1, ButtonBorderStyle.Solid
);
}
/// <summary>
/// places the button into the position of the cell
/// </summary>
internal void UpdateButtonBounds()
{
var r = Row.Index;
var c = Col.Index;
if (r < 0 || c < 0)
{
return;
}
var rc = Grid.GetCellRect(r, c, false);
Bounds = rc;
}
#endregion
//NOTE, needed for hash set
public bool Equals(ColumnButton x, ColumnButton y)
{
if (ReferenceEquals(x, y))
{
return true;
}
if (ReferenceEquals(x, null))
{
return false;
}
if (ReferenceEquals(y, null))
{
return false;
}
if (x.GetType() != y.GetType())
{
return false;
}
return Equals(x.Grid, y.Grid) && Equals(x.Row, y.Row) && Equals(x.Col, y.Col);
}
public int GetHashCode(ColumnButton obj)
{
unchecked
{
var hashCode = (obj.Grid != null ? obj.Grid.GetHashCode() : 0);
hashCode = (hashCode * 397)^(obj.Row != null ? obj.Row.GetHashCode() : 0);
hashCode = (hashCode * 397)^(obj.Col != null ? obj.Col.GetHashCode() : 0);
return hashCode;
}
}
Thanks in advance.