311 messaggi dal 25 novembre 2010
ciao!

sto facendo un programmino che una datagrid con i dati impostati da un xmldataprovider.
vorrei filtrare la datagrid usando una textbox.
ho provato a mettere questo evento, ma ottengo una eccezione di tipo:
Unable to cast object of type 'System.Xml.XmlElement' to type 'System.String'

questo l'evento:
 private void TxtSearch_TextChanged(object sender, System.Windows.Controls.TextChangedEventArgs e)
        {
            try
            {
                ICollectionView cv = CollectionViewSource.GetDefaultView(gridClients.ItemsSource);
                if (cv != null)
                {
                    string text = this.txtSearch.Text;
                    cv.Filter = (obj) => ((string)obj).Contains(text);
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

lo so che sto sbagliando, ma ho finito le idee!
Modificato da fermat il 27 febbraio 2015 14.32 -
11.881 messaggi dal 09 febbraio 2002
Contributi
ciao,
a giudicare dall'errore, il problema è in questa istruzione.
cv.Filter = (obj) => ((string)obj).Contains(text);

Se i tuoi oggetti sono degli XmlElement, non puoi castarli a stringa. Prova invece con qualcosa di simile:
cv.Filter = (obj) => ((XmlElement)obj).InnerText.Contains(text);


ciao,
Moreno

Enjoy learning and just keep making
311 messaggi dal 25 novembre 2010
ciao!

grazie per la risposta.
ho provato il tuo codice, ma ottengo un altro errore:
Object reference not set to an instance of an object
11.881 messaggi dal 09 febbraio 2002
Contributi
ciao,
probabilmente non ho capito di che tipo è obj o in quale parte dell'XmlElement si trova il testo devi controllare.

Prova a risolvere il problema da solo usando il debugger di Visual Studio.

Ti dò delle indicazioni. Per prima cosa modifica il codice così:

cv.Filter = (obj) => {
var elemento = obj as XmlElement;
if (elemento is null) return false;
var testo = elemento.InnerText;
if (string.IsNullOrEmpty(testo)) return false;
return testo.Contains(text);
};

Ora lancia il programma. Non dovrebbe più darti errore ma probabilmente non funzionerà neanche come ti aspetti.

Torna nel codice e metti un breakpoint sulla prima riga, ovvero in corrispondenza di var elemento = obj ....
Lancia l'applicazione in debug ed usala. L'esecuzione si dovrebbe interrompere sul breakpoint che hai appena messo. In uno dei pannelli inferiori di Visual Studio potrai vedere le variabili locali, tra cui troverai obj.
Come vedi qui, c'è anche una colonna Type che ti dice il tipo. Si tratta effettivamente di un XmlElement?

Se sì, dove si trova il testo a cui sei interessato? E' il testo interno dell'elemento (cioè quello contenuto tra i tag)? Oppure si trova su un attributo?

ciao,
Moreno

Enjoy learning and just keep making
311 messaggi dal 25 novembre 2010
ciao!

ti ringrazio per l'aiuto, ma hanno cambiato il formato output del web service da xml a json.
quindi ho dovuto rivedere il mio programma e cambiare XmlDataSource con un altro datasource.

grazie ancora!

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.