Solved

I need help developing a Custom DataGridView control in C#

Posted on 2009-04-14
2
693 Views
Last Modified: 2013-12-17
I want all the DataGridViews in my program to have nearly identical appearance behavior. What strategy accomplishes this in a way that maximizes code reuse and is easy to maintain? I think that I need some help expanding my fundamental understanding of how controls work in C#.

Here is a more specific description of my issue I have a rich client C# application with multiple datagridviews. All the datagridvews need to have nearly the same behavior and the same appearance. I have tried a few things to reduce the amount of duplicate code.

Initially I created a "Visual Appearance" class to handle the look and feel of row headers etc. I use it by sending the datagridview through a static "FormatDataGridview" method. That worked for awhile, but I began to notice I needed to doubleclick cells to access the drop downs. I only want my users to need to single click. I found code on the internet which gives me the behavior I want:
When user single clicks on a cell, DataGridView.CellEnter event is raised. Use the DataGridView.BeginEdit() method to put the current selected cell into EditMode.

Code Snippet
private void dataGridView1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
    dataGridView1.BeginEdit(false);
    if (e.ColumnIndex == 0)// the combobox column index
    {
        if (this.dataGridView1.EditingControl != null
            && this.dataGridView1.EditingControl is ComboBox)
        {
            ComboBox cmb = this.dataGridView1.EditingControl as ComboBox;
            cmb.DroppedDown = true;
        }
    }
}

I want all my DataGridView controls to have this behavior but I do not want to write this code 10x, so I put it into my local control library. I wont need to rewrite it, but I will need to manually add a reference to this function for each datagridview. My thought is that this approach will be difficult to maintain. I also thought about inheritance, but I was not sure how this would work in the context of controls. ( I did something like this before with unsatisfactory results)

Feeling ambitius, I decided to see if writing a custom control might accomplish what  I want. So I went on the web and found a tutorial that I  felt I could follow. This one seemed user friendly:
http://knol.google.com/k/dave-andrews/creating-custom-controls-with-c-net/617czubfqh7e/2#

When I started to add my behaviors I found that all the methods called by the control are static, and the code I need to add is not static. So I feel stymied.

Please let me know if more information and/or code snippents would help you answer my questions.

Thanks!

Matt





0
Comment
Question by:mattjankowski
2 Comments
 
LVL 96

Accepted Solution

by:
Bob Learned earned 500 total points
ID: 24148382
It sounds like you could use the DataGridView.EditMode:

DataGridView.EditMode
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.editmode.aspx

DataGridViewEditMode Enumeration
http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridvieweditmode.aspx

EditOnEnter
---------------
Editing begins when the cell receives focus. This mode is useful when pressing the TAB key to enter values across a row, or when pressing the ENTER key to enter values down a column.  
0
 

Author Closing Comment

by:mattjankowski
ID: 31569989
Use of the DataGridView.EditMode resolved my issue, saving me a ton of programming. Thanks!
0

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

Welcome my friends to the second instalment and follow-up to our Minify and Concatenate Your Scripts and Stylesheets (http://www.experts-exchange.com/Programming/Languages/.NET/ASP.NET/A_4334-Minify-and-Concatenate-Your-Scripts-and-Stylesheets.html)…
Wouldn’t it be nice if you could test whether an element is contained in an array by using a Contains method just like the one available on List objects? Wouldn’t it be good if you could write code like this? (CODE) In .NET 3.5, this is possible…
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

747 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

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now