Dynamic Objects for ASPxGridview
- by André Snede Hansen
I have a dictionary that is populated with data from a table, we are doing this so we can hold multiple SQL tables inside this object. This approached cannot be discussed.
The Dictionary is mapped as a , and contains SQL column name and the value, and each dictionary resembles one row entry in the Table.
Now I need to display this on a editable gridview, preferably the ASPxGridView.
I already figured out that I should use Dynamic Objects(C#), and everything worked perfectly, up to the part where I find out that the ASPxGridview is built in .NET 2.0 and not 4.0 where Dynamic objects where implemented, therefor I cannot use it...
As you cannot, to my knowledge, add rows to the gridview programmatically, I am out of ideas, and seek your help guys!
protected void Page_Load(object sender, EventArgs e)
{
UserValidationTableDataProvider uvtDataprovider = _DALFactory.getProvider<UserValidationTableDataProvider>(typeof(UserValidationTableEntry));
string[] tableNames = uvtDataprovider.TableNames;
UserValidationTableEntry[] entries = uvtDataprovider.getAllrecordsFromTable(tableNames[0]);
userValidtionTableGridView.Columns.Clear();
Dictionary<string, string> firstEntry = entries[0].Values;
foreach (KeyValuePair<string, string> kvp in firstEntry)
{
userValidtionTableGridView.Columns.Add(new GridViewDataColumn(kvp.Key));
}
var dynamicObjectList = new List<dynamic>();
foreach (UserValidationTableEntry uvt in entries)
{
//dynamic dynObject = new MyDynamicObject(uvt.Values);
dynamicObjectList.Add(new MyDynamicObject(uvt.Values));
}
}
public class MyDynamicObject : DynamicObject
{
Dictionary<string, string> properties = new Dictionary<string, string>();
public MyDynamicObject(Dictionary<string, string> dictio)
{
properties = dictio;
}
// If you try to get a value of a property
// not defined in the class, this method is called.
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
// Converting the property name to lowercase
// so that property names become case-insensitive.
string name = binder.Name.ToLower();
string RResult;
// If the property name is found in a dictionary,
// set the result parameter to the property value and return true.
// Otherwise, return false.
bool wasSuccesfull = properties.TryGetValue(name, out RResult);
result = RResult;
return wasSuccesfull;
}
// If you try to set a value of a property that is
// not defined in the class, this method is called.
public override bool TrySetMember(SetMemberBinder binder, object value)
{
// Converting the property name to lowercase
// so that property names become case-insensitive.
properties[binder.Name.ToLower()] = value.ToString();
// You can always add a value to a dictionary,
// so this method always returns true.
return true;
}
}
Now, I am almost certain that his "Dynamic object" approach, is not the one I can go with from here on.
I hope you guys can help me :)!