Remplir combobox et erreur system.data.datarowview [Résolu]

soupiste 79 Messages postés samedi 12 avril 2008Date d'inscription 22 juin 2011 Dernière intervention - 29 sept. 2009 à 17:02 - Dernière réponse : soupiste 79 Messages postés samedi 12 avril 2008Date d'inscription 22 juin 2011 Dernière intervention
- 7 oct. 2009 à 17:39
salut !

J'ai aujourd'hui un problème, le même qui me semble récurrent sur le forum, mais dont je ne trouve pas la solution:
En effet, je remplis mon combobox d'une liste de feuilles contenues dans un fichier excel par le code suivant:

if (openFDialog.ShowDialog() == DialogResult.OK)
{
LabelFile.Text = openFDialog.FileName;
System.Data.OleDb.OleDbConnection ExcelConnection = null;
System.Data.DataTable ExcelTables = new System.Data.DataTable("TABLE");

try
{
ExcelConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + openFDialog.FileName + ";Extended Properties=" + (char)34 + "Excel 8.0;HDR=Yes;" + (char)34 + ";");
ExcelConnection.Open();
ExcelTables = ExcelConnection.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

ComboBoxEx.DataSource = ExcelTables;
ComboBoxEx.DisplayMember = "TABLE";
}
catch (System.Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
// ExcelConnection.Close();
}

Le seul résultat que je constate, c'est que mon combobox se rempli de SYSTEM.DATA.DATAROWVIEW
J'ai beau bidouillé pour voir quel était le problème, mais rien à faire, et je traine encore !

De l'aide s'il vous plait !

je développe en C#
Afficher la suite 

6 réponses

Répondre au sujet
soupiste 79 Messages postés samedi 12 avril 2008Date d'inscription 22 juin 2011 Dernière intervention - 7 oct. 2009 à 17:39
+3
Utile
Grand merci à toi MasterSleepy !

Ce cas marche parfaitement! J'avais auparavant envisagé cette manière de faire, mais je m'étais bloqué à mon foreach qui ne reconnaissait pas mon
" Excel.Worksheet " J'ignorais que appeler using Excel ou using Microsoft.Office.Interop.Excel était différent ! et à propos, j'ai dû modifier ton code pour que ça marche :

Code qui marche :

if (openFDialog.ShowDialog() == DialogResult.OK)
{
LabelFile.Text = openFDialog.FileName;
myApp = new Microsoft.Office.Interop.Excel.Application();
myWkb = myApp.Workbooks.Open(openFDialog.FileName, false, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, false, 1, 0);
allWorkSheet.Clear();

foreach (Excel.Worksheet myWks in myWkb.Worksheets)
{
allWorkSheet.Add(myWks.Name.ToString());
}
ComboBoxEx.DataSource = allWorkSheet;
ComboBoxEx.Refresh();

myWkb.Close(false, System.Type.Missing, System.Type.Missing);
myApp.Quit();

}

J'ai seulement appelé : using Microsoft.Office.Interop.Excel et non using Excel = Microsoft.Office.Interop.Excel

Et donc merci de m'avoir donné le chemin ! Ce code saura certainement servir à bon nombre de personnes !

Salutation !!!!!!!!!!!!!!!!!!!!!!! javascript:void(0);
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de soupiste
cs_MasterSleepy 6 Messages postés jeudi 7 décembre 2006Date d'inscription 6 octobre 2009 Dernière intervention - 5 oct. 2009 à 16:09
0
Utile
Salut,

Essaye de remplacer
ComboBoxEx.DisplayMember = "TABLE";
par
ComboBoxEx.DisplayMember = "TABLE_NAME";

Chez moi cela fonctionne mais il ajoute un "$" à la fin du nom.

++
MasterSleepy.
Commenter la réponse de cs_MasterSleepy
soupiste 79 Messages postés samedi 12 avril 2008Date d'inscription 22 juin 2011 Dernière intervention - 5 oct. 2009 à 18:09
0
Utile
Mais, dans ce cas, "TABLE_NAME" serait vu en tant que quoi ?

Toutefois, j'ai bien essayé, et ça marche !
Mais comme tu l'as toi même dis, il y a des expression du type ' et $ à la fin du nom de la feuille.

De même, dans mon application, le nom de feuille sélectionnée dans le combobox doit être renvoyé et sera prise en compte dans une methode qui ouvre le ladite feuille du fichier excel.

Mais, je reçois comme erreur :

[u]L'exception NULLReferenceException n'a pas été gérée par le code utiliseur

La référence d'objet n'est pas définie à une instance d'objet/u

Voici comment j'appelle la valeur sélectionnée dans le combobox:

[b] SheetSelector selectFeuil = new SheetSelector();
string Nomdefeuille = selectFeuil.ComboBoxEx.SelectedItem.ToString();/b



Pouvez vous m'orienter ?
Commenter la réponse de soupiste
soupiste 79 Messages postés samedi 12 avril 2008Date d'inscription 22 juin 2011 Dernière intervention - 5 oct. 2009 à 19:05
0
Utile
Ah! vraiment les gars! ce serait bon de finir avec ce problème qui ne m'a que trop fatigué
Commenter la réponse de soupiste
cs_MasterSleepy 6 Messages postés jeudi 7 décembre 2006Date d'inscription 6 octobre 2009 Dernière intervention - 6 oct. 2009 à 16:35
0
Utile
Pourquoi ne pas instancier un object Excel et parcourir toutes les worksheets.
J'ai faire un test et voilà

private void button2_Click(object sender, EventArgs e)
{
Excel.Application myApp;
Excel.Workbook myWkb;

if (openFDialog.ShowDialog() == DialogResult.OK)
{
LabelFile.Text = openFDialog.FileName;
myApp = new Excel.Application();
myWkb = myApp.Workbooks.Open(openFDialog.FileName, false, false, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing, System.Type.Missing);
allWorkSheet.Clear();
foreach (Excel.Worksheet myWks in myWkb.Worksheets)
{
allWorkSheet.Add(myWks.Name.ToString());
}
ComboBoxEx.DataSource = allWorkSheet;
ComboBoxEx.Refresh();

myWkb.Close(false, System.Type.Missing, System.Type.Missing);
myApp.Quit();
}
}

Il faut avoir définir
BindingList<String> allWorkSheet;
en entête de class et
allWorkSheet = new BindingList<string>();
dans le constructeur.

++
MasterSleepy.
Commenter la réponse de cs_MasterSleepy
cs_MasterSleepy 6 Messages postés jeudi 7 décembre 2006Date d'inscription 6 octobre 2009 Dernière intervention - 6 oct. 2009 à 16:37
0
Utile
J'oubliais il faut un référence a Microsoft.Office.Interop.Excel
et
using Excel = Microsoft.Office.Interop.Excel;

++
Commenter la réponse de cs_MasterSleepy

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.