Solved

Easy Question: Dynamically Formatting DataGrid columns

Posted on 2004-09-28
8
250 Views
Last Modified: 2008-03-06
Hello experts!

I have a DataGrid that is bound to a custom-made DataSet. I would like to know how I can make one of the columns a column of LinkButtons programatically instead of just plaintext. I want to program an EventHandler to handle the LinkButton.Click events.

While we're at it...How can we programatically format a column's properties, e.g. alignment, font, etc?

Any help is appreciated.

Sincerely,
Taarik.
0
Comment
Question by:TZRick
  • 4
  • 2
8 Comments
 
LVL 1

Author Comment

by:TZRick
ID: 12174008
So far, the grid is displayed with all values correct, etc. It's just the formatting now. Here is the code for DataSet and DataGrid creation:

private void eventsListing ()
            {
                  DataSet ds = new DataSet ();
                  ds.Tables.Add (new DataTable ());
                  object [] values;
                  ds.Tables [0].Columns.Add (new DataColumn ("Event", typeof (string)));
                  ds.Tables [0].Columns.Add (new DataColumn ("Expected Attendance", typeof (string)));

                  for (int counter = 0; counter < 8; counter++)
                  {
                        values = new object [] {(getEventName ((ExtendedEvents)counter)),
                                                               getCountPerEvent ((ExtendedEvents) counter)};
                        ds.Tables [0].Rows.Add (values);
                  }
                                    
                  dgRSVP.DataSource = ds.Tables [0];
                  dgRSVP.DataBind ();
                  
                  return;
            }
0
 
LVL 1

Expert Comment

by:CNTITDEPT
ID: 12174647
Have you tried playing with the html side:

example:

<asp:datagrid >
and the many properties it has...... <BoundColumn>..... <HyperLinkColumn>........<TemplateColumn>....... etc...                                                                                                
0
 
LVL 1

Expert Comment

by:ryeandi
ID: 12174692
DataSet ds = new DataSet ();
ds.Tables.Add (new DataTable ("TableName"));
object [] values;
ds.Tables [0].Columns.Add (new DataColumn ("Event", typeof (string)));
ds.Tables [0].Columns.Add (new DataColumn ("Expected Attendance", typeof (string)));

for (int counter = 0; counter < 8; counter++)
  {
     values = new object [] {{(getEventName ((ExtendedEvents)counter)),
                                                     getCountPerEvent ((ExtendedEvents) counter)};    
     ds.Tables [0].Rows.Add (values);
  }

DataGridTableStyle dgts = new DataGridTableStyle();
dgts.MappingName = "TableName";

DataGridTextBoxColumn dgcs = new DataGridTextBoxColumn();
dgcs.MappingName = "Event";
dgcs.Width = 80;
dgts.GridColumnStyles.Add(dgcs);

dgcs = new DataGridTextBoxColumn();
dgcs.MappingName = "Expected Attendance";
dgcs.Width = 80;
dgts.GridColumnStyles.Add(dgcs);
dgRSVP.TableStyles.Add(dgts);                  
                             
dgRSVP.DataSource = ds.Tables [0];                  
               
return;
'****************************************************************
'*******Then******
private void dgRSVP_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
{
  string linkName = dgRSVP[dgRSVP.CurrentRowIndex,1].ToString();
  LinkLabel llbl = new LinkLabel();
  llbl.Size = new System.Drawing.Size(30, 10);
  llbl.AutoSize = true;
  llbl.Text = linkName;
  llbl.LinkClicked += new LinkLabelLinkClickedEventHandler(llbl_LinkClicked);

  DataGridTextBoxColumn dgtb = (DataGridTextBoxColumn)dgRSVP.TableStyles[0].GridColumnStyles[1];

  dgtb.TextBox.Controls.Clear();
  dgtb.TextBox.Controls.Add(llbl);            
}

just make sure you give you dataTable a name so the tablestyle knows what columns to map to.
0
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 
LVL 1

Author Comment

by:TZRick
ID: 12179471
Thank you so much for your help ryeandi. Your code looks really ingenious. The only thing is that I am using a WebForm and objects such as DataGridTableStyle seem to be only in the Windows Forms package.

Thank You for your help!

Taarik.
0
 
LVL 1

Author Comment

by:TZRick
ID: 12179591
CNTITDEPT...This DataGrid will be created dynamically. Could you expand a bit on the HTML please. HTML isn't one of my strong points right now. :-)
0
 
LVL 1

Expert Comment

by:CNTITDEPT
ID: 12181568
I think I am on the wrong path here... it looks like you guys are writing for a WinForm not a WebForm, but if it was a Webform it still could be done dynamically using the textwriter to write the html on the fly.
0
 
LVL 1

Accepted Solution

by:
TZRick earned 0 total points
ID: 12182686
You got me wrong CNTITDEPT. I did same that I am using a WebForm. Anyway, thanks for your input. I was able to get help to solve the problem and the solution is below.

Thank you again for your help.

Sincerely,
Taarik.

private void eventsListing ()
{
      Session ["event"] = null;
      DataSet ds = new DataSet ();
      ds.Tables.Add (new DataTable ());
      object [] values;
      ds.Tables [0].Columns.Add (new DataColumn ("Event", typeof (string)));
      ds.Tables [0].Columns.Add (new DataColumn ("Expected Attendance", typeof (string)));

      for (int counter = 0; counter < 8; counter++)
      {
            values = new object [] {(getEventName ((ExtendedEvents)counter)),
                                                   getCountPerEvent ((ExtendedEvents) counter)};
            ds.Tables [0].Rows.Add (values);
      }
      
      Session ["item"] = 0;                  
      dgRSVP.ItemCreated += new DataGridItemEventHandler (dgRSVP_ItemCreated);          
            
      dgRSVP.DataSource = ds.Tables [0];
      dgRSVP.DataBind ();
                  
      return;
}

private void dgRSVP_ItemCreated(object sender, DataGridItemEventArgs e)
{
      DataGrid dg = (DataGrid) sender;
      int count = (int)Session ["item"];
                  
      LinkButton lnkNumbers = new LinkButton ();
                  
      try
      {
            lnkNumbers.Text = dg.Items [count].Cells [1].Text;
            lnkNumbers.CssClass = "maintext";
            lnkNumbers.Click += new EventHandler (lnkNumbers_Click);
            lnkNumbers.ID = count.ToString ();
            dg.Items [count].Cells [1].Text = "";
            dg.Items [count].Cells [1].HorizontalAlign = HorizontalAlign.Center;
            dg.Items [count].Cells [1].Controls.Add (lnkNumbers);
            Session ["item"] = count + 1;
      }
      catch (Exception ex) {}

      return;
}
0

Featured Post

3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Article by: Ivo
C# And Nullable Types Since 2.0 C# has Nullable(T) Generic Structure. The idea behind is to allow value type objects to have null values just like reference types have. This concerns scenarios where not all data sources have values (like a databa…
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
Established in 1997, Technology Architects has become one of the most reputable technology solutions companies in the country. TA have been providing businesses with cost effective state-of-the-art solutions and unparalleled service that is designed…
Finds all prime numbers in a range requested and places them in a public primes() array. I've demostrated a template size of 30 (2 * 3 * 5) but larger templates can be built such 210  (2 * 3 * 5 * 7) or 2310  (2 * 3 * 5 * 7 * 11). The larger templa…

770 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question