Bonsoir à tous,
dans mon application g différentes tables dans ma base de données et toutes renseigne au moyen des collections des datagrid. Donc, nombre de datagrid == nombre de tables. Je souhaiterais une action importer sur chacune de mes grilles. Et pour cela, il me faut faire une méthode importer qui soit générique.
Je souhaiterais de l'aide pour le faire bien que j'ai déjà fait mon bout de code.
public void ImportCollectionEntity(string filename)
{
var character = ';';
var columnHeaderText = "";
var destination = @"D:\tmp";
if (!Directory.Exists(destination))
Directory.CreateDirectory(destination);
var CsvFpath = Path.Combine(destination, filename);
int n = 0;
int m = 0;
List<T> w = new List<T>();
List<string> tab = new List<string>();
System.IO.StreamReader csvFileReader = File.OpenText(CsvFpath);
//we get back all the lines of the csv file
while (csvFileReader.Peek() >= 0)
{
// read and add a line
string line = csvFileReader.ReadLine();
tab.Add(line);
n++;
}
try
{
//we get back all names of the properties of the entity
PropertyInfo[] properties = typeof(T).GetProperties();
for(int i=0;i<properties.Count() -1;i++)
//foreach (PropertyInfo property in properties)
{
columnHeaderText = columnHeaderText + properties[i].Name + character;
// columnHeaderText = columnHeaderText + property.Name + character;
m++;
}
// Retreat of the header of the names of the properties in the table of the T
tab.RemoveAt(0);
foreach (string s in tab)
{
var pas = s.Split(character);
//T POjet = BaseCollection.SingleOrDefault(te=>te.properties[0]);
foreach (T t in BaseCollection)
{
PropertyInfo[] props = typeof(T).GetProperties();
for (int i = 0; i < properties.Count() - 1; i++)
//foreach (PropertyInfo p in properties)
{
//var pValeur = p.GetValue(t, null);
var pValeur = properties[i].GetValue(t, null);
if (Convert.ToBoolean((pas[0]).CompareTo(pValeur)))
{
for (int j = 0; j < props.Count() - 1; j++)
{
if ((props[j].PropertyType == typeof(Int64?)))
{ break; }
if(props[j].PropertyType == typeof(string))
{
props[j].SetValue(t, Convert.ToString(pas[j]), null);
}
else if(props[j].PropertyType == typeof(bool))
{
if ((pas[j].Equals("True")) || (pas[j].Equals("False")) || (pas[j].Equals("false")) || (pas[j].Equals("true")))
props[j].SetValue(t,Convert.ToBoolean(pas[j]), null);
}
else if (props[j].PropertyType == typeof(Int64))
{
props[j].SetValue(t, Convert.ToInt64(pas[j]), null);
}
else
{
props[j].SetValue(t, Convert.ToInt32(pas[j]), null);
}
}
w.Add(t);
else
{
for (int j = 1; j < props.Count()-1; j++)
{
if (props[j].PropertyType == typeof(string))
{
props[j].SetValue(t, Convert.ToString(pas[j]), null);
}
else if (props[j].PropertyType == typeof(bool))
{
if ((pas[j].Equals("True")) || (pas[j].Equals("False")) || (pas[j].Equals("false")) || (pas[j].Equals("true")))
props[j].SetValue(t, Convert.ToBoolean(pas[j]), null);
}
else
{
props[j].SetValue(t, Convert.ToInt32(pas[j]), null);
}
}

}
foreach(T t in w)
{
BaseCollection.Add(t);
}
break;
}
break;
}
}
catch (Exception ex)
{
log.Error(string.Format(
"An error occurred during import: {0}", ex.Message), ex);
}
}
Cette méthode n'est pas des plus optimales et comporte sans doute des erreurs donc, si quelqu'un a une idée à me proposer même si elle n'est pas dans le même sens que ce que j'ai écrit. ou peut m'aider à modifier mon code de telle façon kil marche o mieux, je l'en serais très reconnaissant.merci.