M
Maulin Vasavada
Hi,
I am trying to develop Windows Forms application (not Web.UI stuff),
and
I wanted to put LinkLabel in the DataColumn of DataGrid but I am not
able to do so. I got this below link where the guy extended
DataGridColumnStyle to have combobox but I can't figure out how to put
LinkLabel instead of combobox used there.
http://www.c-sharpcorner.com/winforms/ComboBoxInDataGridSKJ.asp
The issue with that example code is I have to setup too many things to
run it as its using Sql. I appreciate his sharing but I wish he would
have done it more simplistically to show an example rather than having
those sql things in there.
I copied his code and all and tried to understand by putting Enum
object in combobox but all in vein...though I now understand those
DataSet and all upto some extent. So at the end I decided to extend the
DataGridColumnStyle to put LinkLabel and copied Paint method from his
code and have mixed things right now. Here is the code which is not
working,
namespace TestUIApplication
{
public class LinkColumnataGridColumnStyle
{
int xMargin = 5;
int yMargin = 5;
private LinkLabel linkLabel;
//
// Create a new column - DisplayMember,
ValueMember passed by string
//
public LinkColumn(LinkLabel linkLabel)
{
this.linkLabel = linkLabel;
}
protected override void Abort(int RowNum)
{
MessageBox.Show(new Form(),"in
Abort()");
}
protected override bool Commit(CurrencyManager
DataSource,int RowNum)
{
MessageBox.Show(new Form(),"in
Commit()");
return true;
}
protected override void ConcedeFocus()
{
MessageBox.Show(new Form(),"in
ConcedeFocus()");
}
protected override void Edit(CurrencyManager
Source ,int
Rownum,Rectangle Bounds, bool ReadOnly,string InstantText, bool
CellIsVisible)
{
MessageBox.Show(new Form(),"in
Edit()");
}
protected override int GetMinimumHeight()
{
return linkLabel.PreferredHeight +
yMargin;
}
protected override int
GetPreferredHeight(Graphics g ,object Value)
{
System.Diagnostics.Debug.WriteLine("GetPreferredHeight()");
return FontHeight+yMargin;
}
protected override Size
GetPreferredSize(Graphics g, object Value)
{
MessageBox.Show("GetPreferredSize():"+linkLabel.Text);
Size Extents =
Size.Ceiling(g.MeasureString(linkLabel.Text,
this.DataGridTableStyle.DataGrid.Font));
Extents.Width += xMargin * 2 +
DataGridTableGridLineWidth ;
Extents.Height += yMargin;
return Extents;
}
protected override void Paint(Graphics
g,Rectangle
Bounds,CurrencyManager Source,int RowNum)
{
Paint(g, Bounds, Source, RowNum,
false);
}
protected override void Paint(Graphics
g,Rectangle
Bounds,CurrencyManager Source,int RowNum,bool AlignToRight)
{
string Text = linkLabel.Text;
PaintText(g, Bounds, Text,
AlignToRight);
}
private void PaintText(Graphics g ,Rectangle
Bounds,string Text,bool
AlignToRight)
{
Brush BackBrush = new
SolidBrush(this.DataGridTableStyle.BackColor);
Brush ForeBrush= new
SolidBrush(this.DataGridTableStyle.ForeColor);
PaintText(g, Bounds, Text,
BackBrush, ForeBrush, AlignToRight);
}
private void PaintText(Graphics g , Rectangle
TextBounds, string
Text, Brush BackBrush,Brush ForeBrush,bool AlignToRight)
{
System.Console.WriteLine("in
paint");
Rectangle Rect = TextBounds;
RectangleF RectF = Rect;
StringFormat Format = new
StringFormat();
if(AlignToRight)
{
Format.FormatFlags =
StringFormatFlags.DirectionRightToLeft;
}
switch(this.Alignment)
{
case
HorizontalAlignment.Left:
Format.Alignment = StringAlignment.Near;
break;
case
HorizontalAlignment.Right:
Format.Alignment = StringAlignment.Far;
break;
case
HorizontalAlignment.Center:
Format.Alignment = StringAlignment.Center;
break;
}
Format.FormatFlags
=Format.FormatFlags;
Format.FormatFlags
=StringFormatFlags.NoWrap;
g.FillRectangle(BackBrush, Rect);
Rect.Offset(0, yMargin);
Rect.Height -= yMargin;
g.DrawString("maulin",
this.DataGridTableStyle.DataGrid.Font,
ForeBrush, RectF, Format);
Format.Dispose();
}
private int DataGridTableGridLineWidth
{
get
{
if(this.DataGridTableStyle.GridLineStyle ==
DataGridLineStyle.Solid)
{
return 1;
}
else
{
return 0;
}
}
}
}
}
And here is the method that loads things,
private void Form1_Load(object sender, System.EventArgs e)
{
listBox1.DataSource =
this.coloursCollection;
DataSet ds = new
DataSet("ColoursSet");
DataTable dt =
ds.Tables.Add("ColoursTable");
dt.Columns.Add("ColoursColumn",typeof(LinkLabel));
LinkLabel ll = new LinkLabel();
ll.Name = "maulin";
ll.Text ="Maulin";
DataRow dr = dt.NewRow();
dr["ColoursColumn"] = ll;
dt.Rows.Add(dr);
GridTableStyle = new
DataGridTableStyle();
GridTableStyle.MappingName =
"ColoursSet";
GridTableStyle.GridColumnStyles.Add(new LinkColumn(ll));
GridTableStyle.GridColumnStyles[0].MappingName =
"ColoursTable";//EDIT ME
GridTableStyle.GridColumnStyles[0].HeaderText = "test";
GridTableStyle.GridColumnStyles[0].Alignment =
HorizontalAlignment.Left;
GridTableStyle.GridColumnStyles[0].Width = 700;
GridTableStyle.GridColumnStyles[0].NullText = string.Empty;
dataGrid1.DataSource = ds;
dataGrid1.DataMember =
"ColoursTable";
dataGrid1.TableStyles.Add(GridTableStyle);
}
Please ignore my table,column names and all , its all the code after
much playing around so far and names might not make sense...
Do you have any idea how to make this work? Any help would be of great
help.
Please forive my obvious mistakes as I am new to C#.
Regards,
Maulin
I am trying to develop Windows Forms application (not Web.UI stuff),
and
I wanted to put LinkLabel in the DataColumn of DataGrid but I am not
able to do so. I got this below link where the guy extended
DataGridColumnStyle to have combobox but I can't figure out how to put
LinkLabel instead of combobox used there.
http://www.c-sharpcorner.com/winforms/ComboBoxInDataGridSKJ.asp
The issue with that example code is I have to setup too many things to
run it as its using Sql. I appreciate his sharing but I wish he would
have done it more simplistically to show an example rather than having
those sql things in there.
I copied his code and all and tried to understand by putting Enum
object in combobox but all in vein...though I now understand those
DataSet and all upto some extent. So at the end I decided to extend the
DataGridColumnStyle to put LinkLabel and copied Paint method from his
code and have mixed things right now. Here is the code which is not
working,
namespace TestUIApplication
{
public class LinkColumnataGridColumnStyle
{
int xMargin = 5;
int yMargin = 5;
private LinkLabel linkLabel;
//
// Create a new column - DisplayMember,
ValueMember passed by string
//
public LinkColumn(LinkLabel linkLabel)
{
this.linkLabel = linkLabel;
}
protected override void Abort(int RowNum)
{
MessageBox.Show(new Form(),"in
Abort()");
}
protected override bool Commit(CurrencyManager
DataSource,int RowNum)
{
MessageBox.Show(new Form(),"in
Commit()");
return true;
}
protected override void ConcedeFocus()
{
MessageBox.Show(new Form(),"in
ConcedeFocus()");
}
protected override void Edit(CurrencyManager
Source ,int
Rownum,Rectangle Bounds, bool ReadOnly,string InstantText, bool
CellIsVisible)
{
MessageBox.Show(new Form(),"in
Edit()");
}
protected override int GetMinimumHeight()
{
return linkLabel.PreferredHeight +
yMargin;
}
protected override int
GetPreferredHeight(Graphics g ,object Value)
{
System.Diagnostics.Debug.WriteLine("GetPreferredHeight()");
return FontHeight+yMargin;
}
protected override Size
GetPreferredSize(Graphics g, object Value)
{
MessageBox.Show("GetPreferredSize():"+linkLabel.Text);
Size Extents =
Size.Ceiling(g.MeasureString(linkLabel.Text,
this.DataGridTableStyle.DataGrid.Font));
Extents.Width += xMargin * 2 +
DataGridTableGridLineWidth ;
Extents.Height += yMargin;
return Extents;
}
protected override void Paint(Graphics
g,Rectangle
Bounds,CurrencyManager Source,int RowNum)
{
Paint(g, Bounds, Source, RowNum,
false);
}
protected override void Paint(Graphics
g,Rectangle
Bounds,CurrencyManager Source,int RowNum,bool AlignToRight)
{
string Text = linkLabel.Text;
PaintText(g, Bounds, Text,
AlignToRight);
}
private void PaintText(Graphics g ,Rectangle
Bounds,string Text,bool
AlignToRight)
{
Brush BackBrush = new
SolidBrush(this.DataGridTableStyle.BackColor);
Brush ForeBrush= new
SolidBrush(this.DataGridTableStyle.ForeColor);
PaintText(g, Bounds, Text,
BackBrush, ForeBrush, AlignToRight);
}
private void PaintText(Graphics g , Rectangle
TextBounds, string
Text, Brush BackBrush,Brush ForeBrush,bool AlignToRight)
{
System.Console.WriteLine("in
paint");
Rectangle Rect = TextBounds;
RectangleF RectF = Rect;
StringFormat Format = new
StringFormat();
if(AlignToRight)
{
Format.FormatFlags =
StringFormatFlags.DirectionRightToLeft;
}
switch(this.Alignment)
{
case
HorizontalAlignment.Left:
Format.Alignment = StringAlignment.Near;
break;
case
HorizontalAlignment.Right:
Format.Alignment = StringAlignment.Far;
break;
case
HorizontalAlignment.Center:
Format.Alignment = StringAlignment.Center;
break;
}
Format.FormatFlags
=Format.FormatFlags;
Format.FormatFlags
=StringFormatFlags.NoWrap;
g.FillRectangle(BackBrush, Rect);
Rect.Offset(0, yMargin);
Rect.Height -= yMargin;
g.DrawString("maulin",
this.DataGridTableStyle.DataGrid.Font,
ForeBrush, RectF, Format);
Format.Dispose();
}
private int DataGridTableGridLineWidth
{
get
{
if(this.DataGridTableStyle.GridLineStyle ==
DataGridLineStyle.Solid)
{
return 1;
}
else
{
return 0;
}
}
}
}
}
And here is the method that loads things,
private void Form1_Load(object sender, System.EventArgs e)
{
listBox1.DataSource =
this.coloursCollection;
DataSet ds = new
DataSet("ColoursSet");
DataTable dt =
ds.Tables.Add("ColoursTable");
dt.Columns.Add("ColoursColumn",typeof(LinkLabel));
LinkLabel ll = new LinkLabel();
ll.Name = "maulin";
ll.Text ="Maulin";
DataRow dr = dt.NewRow();
dr["ColoursColumn"] = ll;
dt.Rows.Add(dr);
GridTableStyle = new
DataGridTableStyle();
GridTableStyle.MappingName =
"ColoursSet";
GridTableStyle.GridColumnStyles.Add(new LinkColumn(ll));
GridTableStyle.GridColumnStyles[0].MappingName =
"ColoursTable";//EDIT ME
GridTableStyle.GridColumnStyles[0].HeaderText = "test";
GridTableStyle.GridColumnStyles[0].Alignment =
HorizontalAlignment.Left;
GridTableStyle.GridColumnStyles[0].Width = 700;
GridTableStyle.GridColumnStyles[0].NullText = string.Empty;
dataGrid1.DataSource = ds;
dataGrid1.DataMember =
"ColoursTable";
dataGrid1.TableStyles.Add(GridTableStyle);
}
Please ignore my table,column names and all , its all the code after
much playing around so far and names might not make sense...
Do you have any idea how to make this work? Any help would be of great
help.
Please forive my obvious mistakes as I am new to C#.
Regards,
Maulin