Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [VS10] {System.Drawing.Bitmap} e datagridview - HELP!

    salve ragazzi,

    eccomi qua ad impazzire per una cosa che mi sta mandando al delirio e non riesco a trovare nulla ne sulla guida di VS10 ne su internet per risolvere il mio problema..

    sono in fase di debug (ancora ) con un progetto che cataloga i miei files multimediali presenti sul box multimediale e li mette in un oggetto Datagridview..



    come potete vedere dalla foto che ho linkato, il risultato in datagridview è ottimo .. il problema che dopo aver velocizzato la creazione di datagridview (attraverso le righe shared) non riesco più a recuperare il valore della cella/colonna contente come valore l'icona d'immagine..
    guardate cosa mi restituisce dalla finestra immediata se leggo il valore della colonna 2 o 4 (contenenti le immagini/icona del tipo file e Watched)

    codice:
    ?ListaFileDataGridView(2,5).Value
    {System.Drawing.Bitmap}
        System.Drawing.Bitmap: {System.Drawing.Bitmap}
    
    ?ListaFileDataGridView(4,5).Value
    {System.Drawing.Bitmap}
        System.Drawing.Bitmap: {System.Drawing.Bitmap}
    e così via per tutte le celle di queste colonne contenenti le immagini, il valore è semprelo stesso.. eppure le immagni sono visualizzate correttamente così come le ho caricare in datagridview..


    non vi nascondo che sto impazzendo veramente su sta cosa.. com'è possibile che non riesco ad accedere al valore effettivo e mi restituisce sempre e solo il tipo della cella :{System.Drawing.Bitmap}


    chi mi può dare una dritta??

    grazie anticipatamente


    edit : ho provato anche a seguire le indicazioni della guida per l'accesso alle righe shared..ma nulla è cambiato!!

    codice:
    ?ListaFileDataGridView.Rows.SharedRow(100).Cells(2).Value
    {System.Drawing.Bitmap}
        System.Drawing.Bitmap: {System.Drawing.Bitmap}
    ?ListaFileDataGridView.Rows.SharedRow(100).Cells(4).Value
    {System.Drawing.Bitmap}
        System.Drawing.Bitmap: {System.Drawing.Bitmap}

  2. #2
    Benvenuto nel forum!

    Non hai detto cosa vorresti ottenere interrogando la cella contenente l'immagine. Mi spiego meglio: è abbastanza ovvio che se leggi il contenuto di una cella contenente una immagine avrai in risposta {System.Drawing.Bitmap}, perché quello è il valore (o meglio: l'oggetto) effettivamente contenuto nella cella. Non credo tu possa recuperare il nome del file originale dell'icona, se è questo quello che tu intendevi fare.
    Chi non cerca trova.

  3. #3
    ciao e grazie per il benvenuoto e per l'interessamento..

    mi spiego meglio (per far capire meglio quello che sto facendo, chiedetemi pure, cercherò di spiegare meglio il tutto e rispondere alle vostre domande.. voglio risolvere questa situazione)

    ho bisogno di accedere a quel valore specifico di quella cella per valutare l'immagine esistente e sostituirla con un'altra..esempio.. con doppio click sulla cella immagine (colonna watched num 4) mi scambia l'immagine alternativamente con un'immagine bianca e quella con gli occhiali (praticamente sta ad indicare visivamente se quel file video (relativo alla riga) è stato visto o meno (watched), con la possibilità all'utente di modificare questo stato a piacimento..

    le due immagini le ho precaricate nel progetto come risorse (insieme ad altre immagini per il tipo di file video,immagine, audio, etc...)..
    premesso che tutte le celle della colonna 4 le ho impostate su default con un'immagine bianca (=my.resource.NonWathched)

    quando carico le righe, se il video (che sia) è stato visto allora gli do come valore a quella cella l'immagine con gli occhiali che mi ritrovo nelle risorse del progetto, così:
    codice:
    ......
    ImmagineWatched = My.Resources.occhiali_20x20 '<-- immagine che identifica che il video è stato visto
    .......
    questa è la riga di codice che uso per caricare ogni valore di una nuova riga come shared (quindi valori condivisi): (ovviamente a priori c'è tutto il codice per valutare tutti i parametri passatoli come argomento all''inserimento di una nuova riga per listadatagridview)
    codice:
    .....
    ListaDataGridView.Rows.Add(Conta, False, ImmagineTipoFile, File.Name, ImmagineWatched, ((File.Length / 1024) / 1024), File.DirectoryName)
    ......
    naturalmete tralascio tutti gli altri parametri che funzionano benissimo e riesco ad accedere al valore delle rispettive celle, tranne per le colonne immagine che come ho già detto, il valore restituito in ogni caso è un tipo immagine:{System.Drawing.Bitmap}...



    eppure, la cosa strana che prima caricavo i valori per le nuove righe diversamente... però i tempi si allungavano parecchio (tipo per oltre 1000 righe caricate, i tempi si allungavano oltre il minuto) e la memoria ram utilizzata saliva oltre 1 GB..

    esempio..
    aggiungevo una riga vuota alla tabella

    pos=listadatagridview.add

    e poi inserivo ogni valore per ogni cella della nuova riga, così:
    codice:
    listadatagridview(0,pos).value=indice  <---questa colonna è nascosta 
    listadatagridview(1,pos).value=false
    listadatagridview(2,pos).value=ImmagineTipoFile
    listadatagridview(3,pos).value=File.name
    listadatagridview(4,pos).value=ImmagineWatched
    .....e così via fino alla numero 6
    così facendo riuscivo ad accere e valutare il valore di ogni cella immagine... ma l'impiego di risorse risultava esoso (perchè caricava ogni immagine in memoria),quindi mi ha costretto ad abbandonare quella strada e intraprendere quest'ultima con le righe condivise (sharedrow)

    so che il mio problema può essere una banalità a cui io non so come comportarmi e sicuramente quelche esperto potrà aiutarmi ad andare avanti...

    se avete altri dubbi chiedete pure

    ciao

  4. #4
    Secondo me stai commettendo un errore concettuale: stai usando la DataGridView come una specie di origine dati, ossia leggi dei valori in determinate celle per eseguire determinate azioni. Sarebbe meglio, invece, considerare la DataGridView solo come un "front-end" verso l'utilizzatore del software, che contiene dei valori letti da una vera sorgente dati (per esempio un database). Secondo questo schema di funzionamento tutte le azioni effettuate sui record vengono fatte per prima cosa sul database e poi, di riflesso, anche sulla DataGridView. Così facendo il software funzionerebbe bene anche se più utenti collegati in rete lo utilizzassero contemporaneamente (anche se forse questo non è il tuo obiettivo).
    Chi non cerca trova.

  5. #5
    si, avevo provato ad implementare un database.. ma la mia inesprienza in materia riguardo ai database mi ha indotto cambiare strada dopo innumerevoli gratta capi...

    comunque, i dati una volta elaborati e raccolti dal disco, li inserisco nella lista (datagridview). poi in un secondo momento, li salvo in un file di testo ...ma anche qua resta il problema del valore per celle immagini..non è possibile identificare tale valore da salvare!!

    ci sarebbero alcuni accrocchi da fare per ovviare al problema, ma non voglio portarmi dietro altre complesse elaborazioni..che poi risultaneranno in seguito poco efficenti..

    tipo potrei aggiungere due colonne nascoste dove memorizzare paralleramente il riferimento all'immagine...
    oppure crearmi una matrice a parte...
    voglio evitare questi ulteriori accrocchi..

    l'idea del database che avevo intrapreso inizialmente, mi ha bloccato perchè (ripeto) non so (non riesco) a gestire un database con le mie poche conoscenze che ho in materia...
    addirittura ho provato a studiare gli esempi VB di database, e non sono riuscito nemmeno a connettermi al database preimpostato (northwind...) con tutto il codice già steso nell'esempio...(mi da l'errore 40.. server sql 2008 non è installato o una cosa del genere) e guardando nelle installazioni dei programmi nel pc, risulta installato.. quindi abbandonato l'idea e sono andato avanti nell'altra maniera..

    ma anche qua sto avendo i miei gratta capi...

    se solo riuscissi a capire come leggere quel valore immagine ...ca**lo...

  6. #6
    E' troppo difficile aiutarti in concreto perché scrivere un'applicazione come quella che hai in mente tu richiede diverse competenze, oltre a esulare dallo scopo del forum. Anche se il proverbio dice "sbagliando si impara", ti posso già dire a priori che il tuo approccio non ti porterà molto lontano.

    L'ideale, come ti dicevo, sarebbe usare un database. Se non funziona non fermarti davanti alle prime difficoltà ma cerca di andare a fondo dei problemi, altrimenti non porterai a termine nulla.

    Ad ogni modo puoi usare anche un file di testo, nel post precedente hai scritto:
    comunque, i dati una volta elaborati e raccolti dal disco, li inserisco nella lista (datagridview). poi in un secondo momento, li salvo in un file di testo ...ma anche qua resta il problema del valore per celle immagini..non è possibile identificare tale valore da salvare!!
    Ebbene, dovresti fare esattamente il contrario! Cioè:
    • raccogli i dati dal disco
    • elaborali
    • salvali nel tuo file di testo (oppure nel database...)
    • leggi il tuo file di testo e popola la datagridview

    Quando dovrai modificare una proprietà (per esempio visto sì/no) non servirà sapere che immagine hai caricato nella griglia, ma basterà controllare il valore nel file di testo.
    Chi non cerca trova.

  7. #7
    Originariamente inviato da tas
    E' troppo difficile aiutarti in concreto perché scrivere un'applicazione come quella che hai in mente tu richiede diverse competenze, oltre a esulare dallo scopo del forum. Anche se il proverbio dice "sbagliando si impara", ti posso già dire a priori che il tuo approccio non ti porterà molto lontano.
    quello che fà sto progetto non l'ho descritto del tutto..mi sono limitato a descrivere la semplice lettura del filesystem , visualizzazione e salvataggio...ma non si ferma qua ....è indirizzato per leggere , modificare e sincronizzare il tutto con la fonte esterna (ne mio caso è il lettore multimediale connesso alla rete domestica). ho dovuto tenere conto anche di eventuali disconnessioni di tale fonte (per esempio a box spento) si possono apportare modifiche alla tabella dei file multimediali visualizzata (Datagrid), per poi sincronizzare tutte le modifiche apportate una volta che sarà nuovamente disponibile il collegamento con tale fonte (nel mio caso il box multimediale connesso alla rete domestica).. e altre manovre eseguibili anche off-line capirci..
    ma questa parte di progetto oramai è stata scritta ed è in piedi nel codice..non è questo il mio problema

    la cosa che mi sta bloccando è minima che purtroppo mi sta mandando al delirio...ma dico io possibile che non si può risalire tramite codice all'immagine della cella??...ho capito che la cella image non memorizza realmente l'immagine ma sicuramente un puntatore/riferimento a quella immagine (per questioni di memoria e velocità) ..quindi possibile che non può leggere/ricavare tale riferimento/puntatore?? altrimenti risolverei pure con questo!!

    L'ideale, come ti dicevo, sarebbe usare un database. Se non funziona non fermarti davanti alle prime difficoltà ma cerca di andare a fondo dei problemi, altrimenti non porterai a termine nulla.
    sicuramente se avessi potuto proseguire con database sarebbe stato tutto molto più efficente, ma putroppo mi sono bloccato e pur ricercando ovunque il problema avuto, non ho trovato soluzioni in merito alla connessioni database sql!!

    Ad ogni modo puoi usare anche un file di testo, nel post precedente hai scritto:

    Ebbene, dovresti fare esattamente il contrario! Cioè:
    • raccogli i dati dal disco
    • elaborali
    • salvali nel tuo file di testo (oppure nel database...)
    • leggi il tuo file di testo e popola la datagridview

    Quando dovrai modificare una proprietà (per esempio visto sì/no) non servirà sapere che immagine hai caricato nella griglia, ma basterà controllare il valore nel file di testo.
    se ho capito bene... dovrei fare l'accrocco di aggiungere una matrice che contiene i valori salvati nel file di testo...ma questo volevo evitarlo a priori. poi le cose si complicherebbero avendo più fonti da sincronizzare per le modiche e trasazioni...

  8. #8
    Originariamente inviato da michelecali
    se ho capito bene... dovrei fare l'accrocco di aggiungere una matrice che contiene i valori salvati nel file di testo...ma questo volevo evitarlo a priori. poi le cose si complicherebbero avendo più fonti da sincronizzare per le modiche e trasazioni...
    Non è un "accrocchio", ma una soluzione ampiamente utilizzata in .NET e anche in altre tecnologie. Comunemente si usa un Datatable/Dataset, oppure una collection o un array di oggetti. Questo per far si che la tua sorgente dati non sia il controllo datagridview, ma qualcosa di più "solido" e controllabile come per l'appunto dei dati in memoria.
    Chi non cerca trova.

  9. #9
    ok provo a implemntare un arraylist.. lo trovo molto più dinamoco rispetto a matrici multi dimenzionali (in vb 10 trovo una tragedia operare sul ridimenzionamento dell'ultima dimenzione di matrice multi)..

    quindi se ho ben capito, al posto dell'immagine , nell'arraylist ci devo mettere un numero riferito alla n° immagine?!

    esempio se vado a modificare una determinata cella (doppio click su di essa) dovrò controllare sulla listaarray (alla rispettiva posizione) il numero relativo all'immagine visualizzata in datagrid ...e poi valutare il cambiamento

    esempio di relazione
    numero trovato in arralist= 1 ---->> riferimento alla x immagine contenuta in my.resource.....

    e così via...?

    ok farò questo adattamento , sarà lunga adattare tutto il progetto a questa new entry.. ma va là che esco fuori da sto delirio

    comunque resto curioso e dubbioso sul fatto che non si possa leggere quel puntatore!! ma vado avanti..


    grazie. terrò informati sull'esito, quando avrò finito ...comunque mo che ho trovato questo forum non lo lascerò più

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.