Amanda_Panda
Amanda_Panda

Reputation: 1186

How to create a combobox column in a datatable

I've been struggling with this for days, and I'm getting DataTables and dataGridViews all mixed up.

I have a WinForms program, which has a DataGridView, dataGridView1, and a DataTable, errors.

public static DataTable errors = new DataTable();
dataGridView1.DataSource = errors;

Now, further down, in a method called ValidateText, I read data from a text file, line by line, into an array, where I also define the columns for the errors datatable:

 errors.Columns.Add("Account Number");
 errors.Columns.Add("Customer Name");
 errors.Columns.Add("Country");
 errors.Columns.Add("State");
 errors.Columns.Add("Ship-to Country");
 errors.Columns.Add("Ship-to State");

 var lines = File.ReadAllLines(file);

   foreach (string line in lines)
   {.
    . 
    . 
    string []items=line.Split('\t').ToArray();
    errors.Rows.Add(items[0], items[1],...items[5]);

And that works just fine when I run it. the thing is, I want to make the "Country" column have a combo box in it, so when the program is run, and the data is displayed in the dataGridView1, the user will have the opportunity to select a new country, if they want, from the "Countries" column. And further down in the program, I've indeed defined a method that creates a DataGridViewComboBoxColumn

private DataGridViewComboBoxColumn CreateComboBoxColumn()
    {
        DataGridViewComboBoxColumn buildCountries = new DataGridViewComboBoxColumn();
        buildCountries.HeaderText = "List of Countries";
        DataTable dataTable = new DataTable();
        dataTable.Columns.Add("Keys");
        dataTable.Columns.Add("Values");
        KeyValuePair<string, string>[] array = CountryList.ToArray();
        foreach (KeyValuePair<string, string> kvp in array)
        {
            dataTable.Rows.Add(kvp.Key, kvp.Value);
        }
        buildCountries.DataSource = dataTable;
        buildCountries.DisplayMember = "Values";
        buildCountries.ValueMember = "Keys";

        return buildCountries;


    }

The thing that I am having problems with, is how do I get that combo box that I've created in that last method, into the "Countries" column I've created above? I feel like I'm not getting something with DataGridView and DataTable. You bind a DataTable to a DataGridView, but adding this DataGridViewComboBoxColumn seems to be hard.

Thanks,

Amanda

Upvotes: 1

Views: 2367

Answers (1)

spajce
spajce

Reputation: 7092

this is just my suggestion, the .NET Framework had a already list of countries. so you can use this class. i forgot who created this code :)

public static class CountryEntries
    {
        public static IEnumerable<Country> GetCountries()
        {
            return from ri in
                       from ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                       select new RegionInfo(ci.LCID)
                       orderby ri.DisplayName
                   group ri by ri.TwoLetterISORegionName into g                       
                   select new Country
                   {
                       CountryId = g.Key,
                       Title = g.First().DisplayName
                   };
        }
        public class Country
        {
            public string CountryId { get; set; }
            public string Title { get; set; }
        }
    }

Upvotes: 1

Related Questions