views:

969

answers:

2

Hello, I have a class that stores a list of dictionary entries. I want bind that to a datasource for gridview from codebehind.

Code for dictionary type of , representing ErrorMessage and failed field.

public partial class FailedFields
{
    private Dictionary<string, string> Code_Error = new Dictionary<string, string>();
    public void AddFailedField(string field, string message)
    {
        Code_Error.Add(field, message);
    }
    public Dictionary<string, string> GetFailedFields()
    {
        return Code_Error;
    }
}

Code for List of Dictionary entries.

public partial class ErrorFieldsList
{
    private static List<Order.FailedFields> ErrorList = new List<Slab.FailedFields>();
    public void AddErrorField(Order.FailedFields errs)
    {
        ErrorList.Add(errs);
    }
    public List<Order.FailedFields> GetErrorMessages()
    {
        return ErrorList;
    }
}

Running in Visual Studio debug mode, i can see the list has the error list, but i cannot get it to display in the gridview. Bellow is one of the many ways (the one that makes most sense) i tried to set the list as a datasource.

ErrorBoxGridView.DataSource = FailedRecords.GetErrorMessages(). ;
ErrorBoxGridView.DataBind();

Any idea where i am going wrong ? Also, i don't want to specify a datasource in the aspx page because i only want to display this when the error occurs.

If interested why i am doing this to store error messages, have a look at this:link 1

Solved Here Related Question I will document a complete project when i finish on the wiki.

+2  A: 

This can not be done I think. What I'd do is:

  1. Instead of using Dictionary<string, string> define a class that contains two public properties for field and message
  2. Create an object data source for that class (using Visual Studios "Data Sources" window)
  3. Have GetErrorMessages() return List<ErrorClass> instead of Dictionary
  4. Assign that list to the binding source.

EDIT
This is to clarify things according to the latest comments. What you need is one class that contains the information for one error. For example:

public class ErrorInfo
{
   public string Field { get { ... } }
   public string Message { get { ... } }
}

After that you place a BindingSource on your form and (in code) set its DataSource property to a list of error message classes. For example:

private List<ErrorInfo> errorList = new List<ErrorInfo>();
errorList.Add(new ErrorInfo() { ... });
errorList.Add(new ErrorInfo() { ... });
errorList.Add(new ErrorInfo() { ... });

bindingSource.DataSource = errorList;

The data grid view is bound to the BindingSource. You should see data now. You can manually create columns and set them to the respective property names of your ErrorInfo class as well, but then you'd have to set dataGridView.AutoCreateColumns to false somewhere in your code.

Thorsten Dittmar
Yes, using a simple wrapper is simpler than doing around with property descriptors...
gimpf
Thorsten, thanks for your answer, but that won't work as per your description. I need to stored many pairs of (FieldName,ErrorMessage). So ErrorClass must contain a list of (FieldName,ErrorMessage) pairs. But you gave me an idea to scrap the dictionary, and use List<ErrorClass> where ErrorClass represents a list of (FieldName,ErrorMessage) pairs. Hence, i will end up with a list<list<string FieldName, string ErrorMessage>. I will try this and see where it leads.
Slabo
You will - in the end - have to flatten the List<List<...>> into a List<...>, because data binding needs a 1:1 relation between displayed item and "data row" (which, in your case will be an error message for a field).
Thorsten Dittmar
Thanks, i understand that part now. I am now passing the list as an instance of a class. So i have a list objects, each of which is a class containing a list of errors... But i still cannot get it to display in a grid!
Slabo
I've edited my reply to make things somewhat clearer, I hope...
Thorsten Dittmar
A: 

.NET provides a handy KeyValuePair<(Of <(TKey, TValue>)>) structure, that can be used in cases like this. That way you don't have to define your own class. HTH.

Justin