C#: TreeView, archivo config con variables y otros

AlexMnrs Seguir

Beta
Verificación en dos pasos activada
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Desde
28 Oct 2013
Mensajes
66
Buenas!

Ya he dado por finalizado el descanso que me tomé desde el último post que publiqué sobre la app que estoy desarrollando en C# como principiante que soy y, una vez más, vuelvo a la carga con varias dudas que no soy capaz de resolver buscando en Google o Stack Overflow.

La primera duda es sobre los TreeView. Necesito saber cuál es la forma correcta de mostrar unos controles u otros dependiendo del nodo que hayas seleccionado, es decir, yo tengo un formulario (adjunto la imagen justo aquí debajo) a modo de búsqueda el cual contiene un TreeView y un panel. Los nodos de este TreeView1 son Nombre, Apellido, Móvil, Email y Categoría. Lo que quiero es que al seleccionar el nodo Nombre, aparezca un TextBox para que el usuario inserte el nombre que desee buscar, un checkbox para elegir si quiere que la búsqueda sea sensible a mayúsculas, etc. y que al seleccionar un nodo distinto como por ej. Categoría, aparezcan otros controles totalmente distintos.

Np3la48.png


nlvZ5wc.png


No sé si me habré explicado, pero básicamente lo que me gustaría es que los nodos fuesen como páginas individuales, cada una con sus controles.

También, ya que estamos, estaría bien que me dijeseis si hay alguna forma más cómoda de aplicar la sentencia SQL dependiendo del nodo seleccionado, porque claro, yo ahora estoy utilizando un if en el botón de aceptar... Si el nodo seleccionado es Nombre, entonces le meto este código:

PHP:
                using (SQLiteConnection con = new SQLiteConnection(Utilidades.conString))
                {
                    // Abrimos la conexión
                    con.Open();

                    // Creamos un objecto DataTable para hacer referencia a la información retornada por la consulta
                    DataTable datos = new DataTable();

                    // Creamos el comando
                    SQLiteCommand cmd = con.CreateCommand();
                    cmd.CommandText = "SELECT rowid, * FROM contactos WHERE nombre LIKE '" + txtBuscar.Text + '%' + "'";

                    // Creamos un objeto adapter con un constructor que recibe como parámetro el comando asociado
                    SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);

                    // Usamos el método Fill() que deposita de forma ordenada los registros en nuestra tabla
                    da.Fill(datos);

                    Contactos.frmContactos.dgvDatos.Rows.Clear();
                    foreach (DataRow item in datos.Rows)
                    {
                        int n = Contactos.frmContactos.dgvDatos.Rows.Add();
                        Contactos.frmContactos.dgvDatos.Rows[n].Cells[0].Value = item[0].ToString();
                        Contactos.frmContactos.dgvDatos.Rows[n].Cells[1].Value = item[1].ToString();
                        Contactos.frmContactos.dgvDatos.Rows[n].Cells[2].Value = item[2].ToString();
                        Contactos.frmContactos.dgvDatos.Rows[n].Cells[3].Value = item[3].ToString();
                        Contactos.frmContactos.dgvDatos.Rows[n].Cells[4].Value = item[4].ToString();
                        Contactos.frmContactos.dgvDatos.Rows[n].Cells[5].Value = item[5].ToString();
                    }
                }

Si el nodo es otro, entonces le paso el mismo código pero cambiando en la sentencia el nombre de la columna, no tiene más. Y funciona, pero no sé si es la forma adecuada de hacerlo o es una chapuza, que no me extrañaría, jajaja.

Vamos con la siguiente y última duda ya para finalizar la chapa que os estoy dando! :rolleyes:

Sé que Visual Studio ya trae implementada una opción, si te vas a las propiedades del proyecto, para crear valores de configuración y guardar datos y esas cosas, pero el archivo es un XML. Me gustaría saber si sería posible crear un archivo de configuración de este estilo:

Insertar CODE, HTML o PHP:
[Settings]
SeparatorChar = ";;"
ColumnWidth = "003-030-005-015-004-030-030-050-003-050-020-002-010-030-010-030-030-010-007-002-050-015-002-002-010-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-"
ExportColumns = "00-01-02-03-05-06-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-"
ImportColumns = "99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-00-00-00-00-00-00-00-00-00-00-00-00-00-00-"
WidthColumn = "040-485-050-120-180-079-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-000-"
MainColumns = "00-01-02-03-05-06-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-99-"
ToolTipDelay = 500
SimpleToolTips = 1
ToolTipOnRightClick = 0
ToolTipOnSelectedOnly = 1
ShowToolTipsInBookShelf = 1
SortInGroupsMode = 0
UseGroupsWhenSortingIndexes = 0
UseGroupsWhenSortingTitles = 1
UseTBDbThumbnailAsMainThumbnail = 1
UseTVDbPlotoutlineAsMainPlotOutline = 1
TVDBLanguageId = 7
LastRanVersion = 256
UseRelativePathsForPlayingMovies = 0
ShowLoanDuration = 1
SortOnLoanDuration = 1
ShowToolBar = 1
Bookshelf = 1
ShowMovieDetails = 0
AutoBackup = 2
Last Options Page = 0
DontUpdateTitles = 1
Dont Overwrite Covers = 1
Only Query New Movies = 0
MultipleIMDBResultsMode = 1
PrintRowColor = 16247513
UseColoredRowsForPrinting = 1
LoanedLabelColor = 25600
SeenLabelColor = 139
ToolbarButtonColor = 16309445
Labels Color = 8388608
Selection Text Color = 0
Selection Color = 55295
Even Color = 15794160
Glow Color = 0
Odd Color = 16777215
LastUsedExportFile = ""
PrintFont = "Arial"
LastUsedTemplate = 0
PrintFontSize = 10
OutputPath = ""
DatabasePath = ""
Prefixes = "The,A,De,Het"
CreateHTMLPatchFolder = 0
CreateHTMLPatchFrom = 0
CustomJPEGQualityInHtmlExport = 90
AddYearToTitleInHtmlExport = 1
UseThumbnailsInHtmlExport = 1
Include3DInHtmlExport = 1
IncludeGenresInHtmlExport = 1
CreateBackupWhenExportingHTML = 1
UseCustomJPEGQualityInHtmlExport = 0
RoundPersonalRatings = 1
ShowNumberOfVotes = 1
ShowRatings = 0
ShowAKAinSearchResults = 0
FixTitlePrefix = 0
CheckForUpdates = 1
NumberOfLatestAdditions = 10
EnableLoanHistory = 1
ShowHTMLResult = 1
HTMLSortOrder = 1
IncludeLatestAdditions = 1
IncludeAllMovies = 1
ShowExport = 1
ImportMode = 0
UseAddMovieDefaults = 1
UseLastFilter = 0
UseLastSort = 1
Language = 5
LastUsedFilter = 34
SortDirection = 1
SortColumn = 0
OnlyUnseenRandom = 1
BrowseUseCover = 1
IgnoreDriveLetters = 1
BrowseUseNFO = 1
BrowsePosponeSelection = 1
BrowseQueryIMDB = 1
BrowseUseFirstEntry = 0
BrowseRecursive = 1
OverriddenGenres = "||||||||||||||||||||||||||||||||||"
AlternativeTitleSearch = 0
MatchWholeWordSearch = 0
MatchCaseSearch = 0
LastUsedTitleSearch = "ve"
PlotOutlineLanguageTMDb = 0
ShowSeasonInfoInTVSeriesNames = 1
ShowCharacters = 1
ShowTopAfterSorting = 0
TMDbPlotOutlineFallback = 1
ImportPlotOutlineTMDb = 0
ImportThumbNailTMDb = 0
ImportMovieTrailerTMDb = 0
ImportMovieTrailer = 1
TitleType = 1
Import Thumbnail FreeCovers = 0
Import Thumbnail MovieMeter = 0
Import Thumbnail = 1
CertificationCountry = "USA"
ImportDuration = 1
ImportLanguage = 1
ImportCountry = 1
ImportYear = 1
ImportAwards = 1
ImportCertification = 1
ImportAlternativeTitle = 3
ImportPlotOutline MovieMeter = 0
ImportPlotOutline = 1
ImportRating = 1
ImportNrActors = 5
ImportDirector = 1
ImportGenres = 1
UseActorsWithPictureFirst = 1
ImportAspectRatio = 1
ImportActorPhotos = 1
ImportActors = 1
ShowTVSeriesBoxes = 1
MediaInfoPath = ""
UseMediaInfo = 0
IgnorePrefixOnTitleSort = 1
CustomBackground = ""
CustomBackgroundOffset = 0
BookShelfStyle = 3
DVDBOX_MARGIN = 6
UseFixedGlowColors = 1
ShowBluRayBoxes = 7
BookshelfShowSeen = 1
BookshelfShowLoaned = 1
BookshelfShowTitles = 1
BookshelfShowNumbers = 0
NumberDisplayMode = 0
ShowSeenMode = 0
IgnoreKeywords = 1
IgnoreKeywordsString = "Trailer"
DefaultThumbnail = ""
RenameMediaFormat = "%T (%C, %Y) %V %3"
UseFolderName = 0
RenameMediaAll = 0
Renumber = 0
EnableDelete = 0
ProxyServer = ""
PosterMode = 1
UseProxy = 0
Skin = ""
ScreenFont = "Tahoma"
ZoomFactor = 100
DoubleClickMode = 0
ScreenFontSize = 8
ShowReservedPositions = 1
SortSecondaryColumn = 1
DeleteMediaFiles = 0
NrLimitNumberOfMoviesToAdd = 10
LimitNumberOfMoviesToAdd = 0
CurrentDatabase = 0
Databases = "*"
LastUsedSearchTab = 0
LastSaved = "42584.825799"
cy = 665
cx = 987
y pos = 32
x pos = 1957
WindowState = 0

[Paths]
BrowseHD = ""

[Defaults]
SoundLanguages = ""
SoundTypes = ""
Features = 0
SeenOwnWishList = 0
Region = 0
System = 0
SubtitleLanguages = ""
Languages = ""
Case = 0
Media = 0
Source = 0
AspectRatio = 0
Codec = 0
Location = ""
Resolution = "720×576 (PAL DVD)"

[Custom Settings]
CustomField2 = "Campo 2"
CustomField1 = "Campo 1"
Language 5 = ""
Language 4 = ""
Language 3 = ""
Language 2 = ""
Language 1 = ""
Genre 5 = ""
Genre 4 = ""
Genre 3 = ""
Genre 2 = ""
Genre 1 = ""

Como veis es un archivo de texto plano, o eso me parece a mí, con variables y sus valores. Me parece más práctico que no el XML.

Como diría Porky, esto es to, esto es to, esto es todo amigos! :pig:

- - - Actualizado - - -

Ya está todo solucionado.

Para que al seleccionar cada nodo del TreeView aparezcan ciertos controles en el panel de la derecha he definido un UserControl para cada uno de ellos.

Una forma más cómoda de aplicar la sentencia SQL sin tener que reescribir todo el código es creando un método y pasando un parámetro string consulta por ejemplo:

PHP:
        public static void ConsultarDatos(string consulta)
        {
            using (SQLiteConnection con = new SQLiteConnection(Utilidades.conString))
            {
                // Abrimos la conexión
                con.Open();

                // Creamos un objecto DataTable para hacer referencia a la información retornada por la consulta
                DataTable datos = new DataTable();

                // Creamos el comando
                SQLiteCommand cmd = con.CreateCommand();
                cmd.CommandText = consulta;

                // Creamos un objeto adapter con un constructor que recibe como parámetro el comando asociado
                SQLiteDataAdapter da = new SQLiteDataAdapter(cmd);

                // Usamos el método Fill() que deposita de forma ordenada los registros en nuestra tabla
                da.Fill(datos);

                Contactos.frmContactos.dgvDatos.Rows.Clear();
                foreach (DataRow item in datos.Rows)
                {
                    int n = Contactos.frmContactos.dgvDatos.Rows.Add();
                    Contactos.frmContactos.dgvDatos.Rows[n].Cells[0].Value = item[0].ToString();
                    Contactos.frmContactos.dgvDatos.Rows[n].Cells[1].Value = item[1].ToString();
                    Contactos.frmContactos.dgvDatos.Rows[n].Cells[2].Value = item[2].ToString();
                    Contactos.frmContactos.dgvDatos.Rows[n].Cells[3].Value = item[3].ToString();
                    Contactos.frmContactos.dgvDatos.Rows[n].Cells[4].Value = item[4].ToString();
                    Contactos.frmContactos.dgvDatos.Rows[n].Cells[5].Value = item[5].ToString();
                }
            }
        }

Y luego en el botón aceptar del formulario de búsqueda hago lo siguiente:

PHP:
private void btnAceptar_Click(object sender, EventArgs e)
        {
            string consultaNombre = "SELECT rowid, * FROM contactos WHERE nombre LIKE '" + ucBuscarNombre.Instance.txtBuscarNombre.Text + '%' + "'";
            string consultaApellido = "SELECT rowid, * FROM contactos WHERE apellido LIKE '" + ucBuscarApellido.Instance.txtBuscarApellido.Text + '%' + "'";

            if (treeView1.SelectedNode.Text == "Nombre")
            {
                Utilidades.ConsultarDatos(consultaNombre);
                Close();
            }
            else
            {
                if (treeView1.SelectedNode.Text == "Apellido")
                {
                    Utilidades.ConsultarDatos(consultaApellido);
                    Close();
                }
            }
        }

Es decir, si el nodo seleccionado al momento de Aceptar es Nombre, le paso la consulta de buscar en la columna de nombres, si el nodo es Apellido, lo mismo pero la consulta es en la columna de apellido, y así con móvil, email y el resto.

Y por último, para el archivo de configuración con esa estructura de .ini hay una librería que te lo permite: ini-parser

Un saludo!:encouragement:
 

¡Regístrate y comienza a ganar!

Beneficios

  • Gana dinero por participar
  • Gana dinero por recomendarnos
  • Descubre ofertas de empleo diariamente
  • Negocios seguros
  • ¡Información premium y más!

Acceder

¿Ya tienes una cuenta? Accede aquí

Arriba