Usercontrol databinding within a databound datagridview
- by user328259
Good day. I'm developing a Windows application and working with Windows Forms; .Net 2.0.
I have an issue databinding a generic List of Car Rental Companies to a DataGridView when that list contains (one of its properties) anoother generic List of Car Makes. I also have a UserControl that I need to bind to this [inner] generic list ...
Class CarRentalCompany contains:
string Name,
string Location,
List CarMakes
Class CarMake contains:
string Name,
bool isFord,
bool isChevy,
bool isOther
The UserControl has a label for CarMake.Name and 3 checkboxes for each of the booleans of the class. HOw do I make this user control bindable for the class?
In my form, I have a DataGridView binded to the CarRentalCompany object. The list CarMakes could be 0 or more items and I can add these as necessary. How do I establish the binding of CarRentalCompanies properly so CarMakes will bind accordingly??
For example, I have:
List CarRentalCompanies = new List();
CarRentalCompany company1 = new CarRentalCompany();
company1.Name = "Acme Rentals";
company1.Location = "New York, NY";
company1.CarMakes = new List<CarMake>();
CarMake car1 = new CarMake();
car1.Name = "The Yellow Car";
car1.isFord = true;
car1.isChevy = false;
car1.isOther = false;
company1.CarMakes.Add(car1);
CarMake car2 = new CarMake();
car2.Name = "The Blue Car";
car2.isFord = false;
car2.isChevy = true;
car2.isOther = false;
company1.CarMakes.Add(car2);
CarMake car3 = new CarMake();
car3.Name = "The Purple Car";
car3.isFord = false;
car3.isChevy = false;
car3.isOther = true;
company1.CarMakes.Add(car3);
CarRentalCompanies.Add(company1);
CarRentalCompany company2 = new CarRentalCompany();
company1.Name = "Z-Auto Rentals";
company1.Location = "Phoenix, AZ";
company1.CarMakes = new List<CarMake>();
CarMake car4 = new CarMake();
car4.Name = "The OrangeCar";
car4.isFord = true;
car4.isChevy = false;
car4.isOther = false;
company2.CarMakes.Add(car4);
CarMake car5 = new CarMake();
car5.Name = "The Red Car";
car5.isFord = true;
car5.isChevy = false;
car5.isOther = false;
company2.CarMakes.Add(car5);
CarMake car6 = new CarMake();
car6.Name = "The Green Car";
car6.isFord = true;
car6.isChevy = false;
car6.isOther = false;
company2.CarMakes.Add(car6);
CarRentalCompanies.Add(company2);
I load my form and in my load form I have the following: Note: CarDataGrid is a DataGridView
BindingSource bsTheRentals = new BindingSource();
DataGridViewTextBoxColumn companyName = new DataGridViewTextBoxColumn();
companyName.DataPropertyName = "Name";
companyName.HeaderText = "Company Name";
companyName.Name = "CompanyName";
companyName.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
DataGridViewTextBoxColumn companyLocation = new DataGridViewTextBoxColumn();
companyLocation.DataPropertyName = "Location";
companyLocation.HeaderText = "Company Location";
companyLocation.Name = "CompanyLocation";
companyLocation.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
ArrayList carMakeColumnsToAdd = new ArrayList();
// Loop through the CarMakes list to add each custom column
for (int intX=0; intX < CarRentalCompanies.CarMakes[0].Count; intX++) {
// Custom column for user control
string carMakeColumnName = "carColumn" + intX;
CarMakeListColumn carMakeColumn = new DataGridViewComboBoxColumn();
carMakeColumn.Name = carMakeColumnName;
carMakeColumn.DisplayMember = CarRentalCompanies.CarMakes[intX].Name;
carMakeColumn.DataSource = CarRentalCompanies.CarMakes; // this is the CarMAkes List
carMakeColumn.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
carMakeColumnsToAdd.Add(carMakeColumn);
}
CarDataGrid.DataSource = bsTheRentals;
CarDataGrid.Columns.AddRange(new DataGridViewColumn[] { companyName, companylocation, carMakeColumnsToAdd });
CarDataGrid.AutoGenerateColumns = false;
The code I provided does not work because I am unfamiliar with UserControls and custom DataGridViewColumns and DataGridViewCells - I know I must derive from these classes in order to use my User Control properly. I appreciate any advice/assistance/help in this. Thank you.
Lawrence