jueves, 5 de abril de 2012

Convertir Numero entre Decimal y Binario

Objectivo
Convertir numeros de Decimales a Binarios y de Binario a Decimal
 
Codigo C#
 
        private string ConvertDecimalToBinary(string decimaltoconvertto)
        {
            #region Determinar el binario
            int pruebaByte;

            StringBuilder sb = new StringBuilder();

            if (int.TryParse(decimaltoconvertto, out pruebaByte))
            {
                do
                {
                    if (pruebaByte % 2 == 0)
                    {
                        sb.Append("0");

                        pruebaByte = pruebaByte / 2;
                    }

                    else
                    {
                        sb.Append("1");

                        pruebaByte = pruebaByte / 2;
                    }

                } while (pruebaByte > 0);
            }

            else
            {
                return "Valor no valido! Favor introducir un valor entre 0-255";
            }
            #endregion Determinar el binario

            #region Manipular el binario
            // Convertir el valor en una matriz
            char[] binary = sb.ToString().ToArray();

            // invierto el orden de los elementos
            char[] reversed = binary.Reverse().ToArray();

            /*********************************************
            * Agregar codigo para manipular los bits     *
            *********************************************/

            // construir el binario ya ordenado
            StringBuilder sb2 = new StringBuilder();

            foreach (char item in reversed)
            {
                sb2.Append(item);
            }
            #endregion Manipular el binario

            #region Para representar el binario con 8 bits
            int by;

            int.TryParse(sb2.ToString(), out by);

            return by.ToString("00000000");
            #endregion Para representar el binario con 8 bits
        }

        private string ConvertBinaryToDecimal(string binarytoconvertto)
        {
            int mydecimal = 0;

            int f;

            for (int i = 0; i < binarytoconvertto.Length; i++)
            {
                if (new string(binarytoconvertto.ToCharArray().Reverse().ToArray()[i], 1) != "0")
                {
                    int.TryParse(new string(binarytoconvertto.ToCharArray().Reverse().ToArray()[i], 1), out f);

                    mydecimal += ((int)f) * ((int)Math.Pow(2, i));
                }

                else
                {
                    continue;
                }
            }

            return mydecimal.ToString();
        }
Codigo VB
Private Function ConvertDecimalToBinary(decimaltoconvertto As String) As String
 '#Region "Determinar el binario"
 Dim pruebaByte As Integer

 Dim sb As New StringBuilder()

 If Integer.TryParse(decimaltoconvertto, pruebaByte) Then
  Do
   If pruebaByte Mod 2 = 0 Then
    sb.Append("0")

    pruebaByte = pruebaByte / 2
   Else

    sb.Append("1")

    pruebaByte = pruebaByte / 2

   End If
  Loop While pruebaByte > 0
 Else

  Return "Valor no valido! Favor introducir un valor entre 0-255"
 End If
 '#End Region

 '#Region "Manipular el binario"
 ' Convertir el valor en una matriz
 Dim binary As Char() = sb.ToString().ToArray()

 ' invierto el orden de los elementos
 Dim reversed As Char() = binary.Reverse().ToArray()

 '********************************************
'            * Agregar codigo para manipular los bits     *
'            ********************************************


 ' construir el binario ya ordenado
 Dim sb2 As New StringBuilder()

 For Each item As Char In reversed
  sb2.Append(item)
 Next
 '#End Region

 '#Region "Para representar el binario con 8 bits"
 Dim by As Integer

 Integer.TryParse(sb2.ToString(), by)

 Return by.ToString("00000000")
 '#End Region
End Function

Private Function ConvertBinaryToDecimal(binarytoconvertto As String) As String
 Dim mydecimal As Integer = 0

 Dim f As Integer

 Dim i As Integer = 0
 While i < binarytoconvertto.Length
  If New String(binarytoconvertto.ToCharArray().Reverse().ToArray()(i), 1) <> "0" Then
   Integer.TryParse(New String(binarytoconvertto.ToCharArray().Reverse().ToArray()(i), 1), f)

   mydecimal += DirectCast(f, Integer) * DirectCast(Math.Pow(2, i), Integer)
  Else

   Continue While
  End If
  System.Math.Max(System.Threading.Interlocked.Increment(i),i - 1)
 End While

 Return mydecimal.ToString()
End Function
Descripcion:
 
 
 

miércoles, 22 de febrero de 2012

Convertir numero en letra





Objetivo
Convertir números en su respectiva letras

Vista Previa
Blogger
 
Código C#
 
using System;
using System.Globalization;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace ConvNumLetra
{
    public partial class NumeroEnLetraForm : Form
    {
        private static int comas;           // Cantidad de comas en el valor
        private static string[] digitos;    // Grupon de digito en el valor
        private static int td = 1;

        #region Enu_Digitos, Enumeracion con todos los digitos contenido en un numero
        enum Unidad { Cero = 0, Uno = 1, Dos = 2, Tres = 3, Cuatro = 4, Cinco = 5, Seis = 6, Siente = 7, Ocho = 8, Nueve = 9 };
        enum Decena { Once = 11, Dosce = 12, Trece = 13, Cotorce = 14, Quince = 15 };
        enum DecenaEntero { Diez = 10, Veinte = 20, Treinta = 30, Cuarenta = 40, Cincuenta = 50, Sesenta = 60, Setenta = 70, Ochenta = 80, Noventa = 90 };
        enum Centena { Cien = 100, Doscientos = 200, Trecientos = 300, Cuatrocientos = 400, Quinientos = 500, Seiscientos = 600, Seteciento = 700, Ochocientos = 800, novecientos = 900 };
        enum GroupSeparator { None = 0, Mil = 1, Millones = 2, Billones = 4, Trillones = 6, Cuatrillones = 8, Quintillones = 10, Sextillones = 12, Septillones = 14, Octillones = 16, Nonillones = 18 };

        #endregion Enu_Digitos, Enumeracion con todos los digitos contenido en un numero

        /// 
        /// Contructor
        /// 
        public NumeroEnLetraForm()
        {
            InitializeComponent();
            textBox1.Focus();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Focus();
            richTextBox1.Text = ProccessStringMethod(textBox1.Text);
            comas = 0;
            digitos = null;
        }

        private string ProccessStringMethod(string value)
        {
            if (value.Contains(".") || (value.Contains(".") && value.Contains(",")))
            {
                //double dou = Convert.ToDouble(value);

                decimal de = Convert.ToDecimal(value);

                string worknumber = de.ToString("#,#.##", CultureInfo.CurrentCulture);

                string entero = worknumber.Substring(0, worknumber.IndexOf(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator));

                string dec = worknumber.Substring(worknumber.IndexOf(CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator) + 1);

                Regex rex = new Regex("[0-9]");

                MatchCollection mc = rex.Matches(entero);

                StringBuilder sb2 = new StringBuilder();

                foreach (var item in mc)
                {
                    sb2.Append(item);
                }

                return DoConvertMethod(sb2.ToString()) + "con " + dec + "/100";
            }

            else
            {
                return DoConvertMethod(value) + "con 00/100";
            }
        }

        private string DoConvertMethod(string value)
        {
            Regex ex = new Regex(",");

            //double dou = Convert.ToDouble(value);

            decimal de = Convert.ToDecimal(value);

            /****************************************************************************
             * Realizar cualquiera operacion matematica o invocar un metodo que         *
             * la realice sobre el double, en este punto.                              *
             *                                                                          *
             ***************************************************************************/

            comas = ex.Matches(de.ToString("#,#.##", CultureInfo.CurrentCulture)).Count; // cantidad de comas

            char[] groupSeparator = new char[] { (CultureInfo.CurrentCulture.NumberFormat.CurrencyGroupSeparator).ToCharArray()[0] }; // separador decimal de la referencia cultural actual

            digitos = de.ToString("#,#.##", CultureInfo.CurrentCulture).Split(groupSeparator);

            StringBuilder sb = new StringBuilder();

            foreach (string item in digitos)
            {
                try
                {
                    if (comas == 0) // No hay coma, entonce es un numero comun, ejemplo: 512
                    {
                        sb.Append(ProccessDigitMethod(item) + " ");
                        comas--;
                        break;
                    }

                    else
                    {
                        if (comas % 2 == 0)
                        {
                            // Cantidad de comas pares. Importante para la posicion en el diccionario.
                            comas = HelpDoConvertMethod(false, comas, sb, item);

                        }

                        else
                        {
                            // Cantidad de comas impares. Importante para la posicion en el diccionario.
                            comas = HelpDoConvertMethod(true, 01, sb, item);
                        }
                    }
                }
                catch (DivideByZeroException err)
                {
                    sb.Append(ProccessDigitMethod(item) + " " + (Enum.GetName(typeof(GroupSeparator), comas)) + " ");
                    comas--;
                }
            }
            return sb.ToString().ToLower();
        }

        private int HelpDoConvertMethod(bool mpm, int igs, StringBuilder sb, string item)
        {
            #region ItemLeght
            switch (item.Length)
            {
                #region Un Digito
                case 1:
                    if (item == "0")
                    {
                        sb.Append(ProccessDigitMethod(item));
                        comas--;
                    }
                    else
                    {
                        if ((item == "1") && comas >= 1) // singular en los millares que contienen la unidad 1
                        {
                            if (mpm == true)
                            {
                                string rs = ProccessDigitMethod(item).ToLower().Replace("uno", "un");
                                sb.Append(rs + " " + (Enum.GetName(typeof(GroupSeparator), igs)) + " ");
                                comas--;
                            }

                            else
                            {
                                string gs = (Enum.GetName(typeof(GroupSeparator), igs));
                                string rs = ProccessDigitMethod(item).ToLower().Replace("uno", "un");
                                sb.Append(rs + " " + gs.Substring(0, gs.Length - 2) + " ");
                                comas--;
                            }
                        }
                        else
                        {
                            sb.Append(ProccessDigitMethod(item) + " " + (Enum.GetName(typeof(GroupSeparator), igs)) + " ");
                            comas--;
                        }
                    }
                    break;
                #endregion Un Digito

                #region Dos Digitos
                case 2:
                    if (item == "00")
                    {
                        sb.Append(ProccessDigitMethod(item));
                        comas--;
                    }
                    else
                    {
                        if ((item == "01") && comas > 1) // singular en los millares que contienen la unidad 1
                        {
                            if (mpm == true)
                            {
                                string rs = ProccessDigitMethod(item).ToLower().Replace("uno", "un");
                                sb.Append(rs + " " + (Enum.GetName(typeof(GroupSeparator), igs)) + " ");
                                comas--;
                            }

                            else
                            {
                                string gs = (Enum.GetName(typeof(GroupSeparator), igs));
                                string rs = ProccessDigitMethod(item).ToLower().Replace("uno", "un");
                                sb.Append(rs + " " + gs.Substring(0, gs.Length - 2) + " ");
                                comas--;
                            }
                        }
                        else
                        {
                            sb.Append(ProccessDigitMethod(item) + " " + (Enum.GetName(typeof(GroupSeparator), igs)) + " ");
                            comas--;
                        }
                    }
                    break;
                #endregion Dos Digitos

                #region Tres Digitos
                case 3:
                    if (item == "000")
                    {
                        //int x = comas;
                        if (digitos[comas - 1] != "000") // item anterior al actual en la matriz.
                        {                            
                            if (comas % 2 == 0)
                            {
                                sb.Append(ProccessDigitMethod(item) + (Enum.GetName(typeof(GroupSeparator), comas)) + " ");
                                comas--;
                            }

                            else
                            {
                                sb.Append(ProccessDigitMethod(item) + " ");
                                comas--;
                            }
                        }

                        else
                        {
                            sb.Append(ProccessDigitMethod(item));
                            //comas--;

                            if (td>0 && td <= 3)
                            {
                                sb.Append((Enum.GetName(typeof(GroupSeparator), comas)) + " ");
                                //comas--;
                                td += td;
                            }
                            comas--;
                        }
                    }
                    else
                    {
                        if ((item == "001" || item.Substring(1, 2) == "01") && comas > 1)
                        {
                            if (mpm == true)
                            {
                                string rs = ProccessDigitMethod(item).ToLower().Replace("uno", "un");
                                sb.Append(rs + " " + (Enum.GetName(typeof(GroupSeparator), igs)) + " ");
                                comas--;
                            }

                            else
                            {
                                string gs = (Enum.GetName(typeof(GroupSeparator), igs));
                                string rs = ProccessDigitMethod(item).ToLower().Replace("uno", "un");
                                sb.Append(rs + " " + gs.Substring(0, gs.Length - 2) + " ");
                                comas--;
                            }
                        }
                        else
                        {
                            sb.Append(ProccessDigitMethod(item) + " " + (Enum.GetName(typeof(GroupSeparator), igs)) + " ");
                            comas--;
                        }
                    }
                    break;
                    #endregion Tres Digitos
            }
            #endregion ItemLeght
            return comas;
        }

        private string ProccessDigitMethod(string value)
        {
            string re = string.Empty;

            #region ValueLeght
            switch (value.Length)
            {
                #region Un Digito
                case 1:
                    if (value == "0")
                    {
                        re = string.Empty;
                    }
                    else
                    {
                        re = (Enum.GetName(typeof(Unidad), Convert.ToInt32(value)));
                    }
                    break;
                #endregion Un Digito

                #region Dos Digitos
                case 2:
                    if (value == "00")
                    {
                        re = string.Empty;
                    }

                    else
                    {
                        re = ProccessTwoDigitMethod(value);
                    }
                    break;
                #endregion Dos Digitos

                #region Tres Digitos
                case 3:
                    Regex rex2 = new Regex("0");

                    if (value.Contains("0")) // contiene cero
                    {
                        switch (rex2.Matches(value).Count) // cantidad de ceros
                        {
                            #region un cero
                            case 1: // un cero
                                Regex rex3 = new Regex(@"0"); // localizamo el cero

                                switch (value.IndexOf(rex3.Match(value).ToString())) // Posicion del cero
                                {
                                    case 0: // A la izquierda, ej: 011
                                        re = ProccessTwoDigitMethod(value.Substring(1, 2));
                                        break;

                                    case 1: // Centro, ej: 101
                                        if (Convert.ToInt32(value.Substring(0, 1)) == 5) // lleva el prefijo ciento
                                        {
                                            re = (Enum.GetName(typeof(Centena), (Convert.ToInt32(value.Substring(0, 1) + "00")))) + " " + Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(2, 1))).ToLower();
                                        }

                                        else
                                        {
                                            if (Convert.ToInt32(value.Substring(0, 1)) == 1)
                                            {
                                                re = "Ciento " + (Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(2, 1))).ToLower());
                                            }
                                            else
                                            {
                                                re = (Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(0, 1)))) + "Ciento " + (Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(2, 1))));
                                            }
                                        }
                                        break;

                                    case 2: // A la derecha, ej: 110
                                        if (Convert.ToInt32(value.Substring(0, 1)) == 5) // lleva el prefijo ciento
                                        {
                                            re = (Enum.GetName(typeof(Centena), (Convert.ToInt32(value.Substring(0, 1) + "00")))) + " " + ProccessTwoDigitMethod(value.Substring(1, 2)).ToLower();
                                        }

                                        else
                                        {
                                            if (Convert.ToInt32(value.Substring(0, 1)) == 1)
                                            {
                                                re = "Ciento " + ProccessTwoDigitMethod(value.Substring(1, 2)).ToLower();
                                            }
                                            else
                                            {
                                                re = (Enum.GetName(typeof(Centena), Convert.ToInt32(value.Substring(0, 1) + "00"))) + " " + ProccessTwoDigitMethod(value.Substring(1, 2)).ToLower(); ;
                                            }
                                        }
                                        break;
                                }
                                break;
                            #endregion un cero

                            #region Dos ceros
                            case 2: // Dos ceros
                                Regex rex = new Regex(@"[1-9]"); // localizamos numero diferente de cero

                                switch (value.IndexOf(rex.Match(value).ToString())) // Posicion del numero
                                {
                                    case 0: // A la izquierda, ej: 100
                                        re = (Enum.GetName(typeof(Centena), Convert.ToInt32(value)));
                                        break;

                                    case 1: // Centro, ej: 010
                                        re = (Enum.GetName(typeof(DecenaEntero), Convert.ToInt32(value.Substring(1, 2))));
                                        break;

                                    case 2: // A la derecha, ej: 001
                                        re = (Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(2, 1))));
                                        break;
                                }
                                break;
                            #endregion Dos ceros

                            #region Tres ceros
                            case 3: // Tres ceros
                                re = string.Empty;
                                break;
                                #endregion Tres ceros
                        }
                    }

                    else // no contiene cero
                    {
                        if ((value.Substring(0, 1)) == "1")  // sufijo ciento
                        {
                            re = "Ciento " + ProccessTwoDigitMethod(value.Substring(1, 2)).ToLower();
                        }

                        else
                        {
                            re = (Enum.GetName(typeof(Centena), (Convert.ToInt32(value.Substring(0, 1) + "00")))) + " " + ProccessTwoDigitMethod(value.Substring(1, 2));
                        }
                    }
                    break;
                #endregion Tres Digitos

                #region Cero Digitos
                default:
                    re = "Instroduzca un numero";
                    break;
                    #endregion Cero Digitos
            }
            #endregion ValueLeght

            return re;
        }

        private static string ProccessTwoDigitMethod(string value)
        {
            if (value.Contains("0")) // Contiene cero
            {
                if (value == "00") // dos cero, eje: 00
                {
                    return string.Empty;
                }

                else
                {
                    if (value.IndexOf("0") == 0) // cero a la izquierda, eje: 01
                    {
                        return (Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(1, 1))));
                    }

                    else // cero a la derecha, eje: 10
                    {
                        return (Enum.GetName(typeof(DecenaEntero), Convert.ToInt32(value)));
                    }
                }
            }

            else // No contiene cero
            {
                if (Convert.ToInt32(value) > 10 && Convert.ToInt32(value) < 16) // busco en el grupo de decena 
                {
                    return Enum.GetName(typeof(Decena), Convert.ToInt32(value));
                }

                else
                {
                    if (Convert.ToInt32(value) > 15 && Convert.ToInt32(value) < 20)
                    {
                        return "Dieci" + (Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(1, 1)))).ToLower();
                    }

                    else
                    {
                        if ((value.Substring(0, 1)) == "2")
                        {
                            return "Veinti" + (Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(1, 1)))).ToLower();
                        }

                        else
                        {
                            return (Enum.GetName(typeof(DecenaEntero), Convert.ToInt32(value.Substring(0, 1) + 0))) + " y " + Enum.GetName(typeof(Unidad), Convert.ToInt32(value.Substring(1, 1))).ToLower();
                        }
                    }
                }
            }
        }
    }
}
Descarga
Csahrp (C#) Visual basic (VB)
Descripción:

martes, 24 de enero de 2012

Marcar Accion Realizada en DataGridView

Objectivo
Marcar la accion realizada en las filas del DataGridView.

Vista Previa
Blogger
Requisito:
  • Visual Estudio 2008 o Superior
  • SQL Server Express 2005 o superior
Para realizar esta practica :
  • Agregue un projecto tipo WinForm.
  • Agregar una conexion a la base de datos con la que quiere interactual.
    Cómo: Conectarse a los datos de una base de datos.
  • Arrastre el objecto de datos con la que quiere trabajar desde la ventana Origen de Datos hacia el diseñador de formulario.
    Esto generara los objectos(BindingSource, DataSet, TableAdapter, TableAdapterManager y el BindingNavigator)
    necesario para poder realizar las operaciones(CRUD(Create, Read, Update, Delete)) en la grilla con impacto en la base de datos.
  • Deshabilito la funcionalidad de eliminacion del control bindingNavigatorDeleteItem del BindingNavigator.

Blogger
  • Agregue las imagenes que servirar como marcador para las filas.
Blogger
  • Agregamos una columna de tipo DataGridViewImageColumn en la posicion 0 de la coleccion de columnas de la grilla y seteamos algunas de sus propiedades
Blogger

Codigo C#
using System;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

namespace WindowsCS.Formularios
{
    public partial class GridMarkedActionForm : Form
    {
        DataTable table = new DataTable("TB1");

        public GridMarkedActionForm()
        {
            InitializeComponent();

            DoColumn("ID", "System.Int32", true, true);
            DoColumn("NameAccion", "System.String", false, false);
            DoColumn("Image", "System.Byte[]", false, false);
        }
                
        #region Metodos de ayuda
        private void DoColumn(string name, string type, bool unique, bool isprimary)
        {
            DataColumn column = new DataColumn(name);
            column.DataType = Type.GetType(type);
            column.Unique = unique;
            table.Columns.Add(column);

            if (isprimary)
            {
                DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                PrimaryKeyColumns[0] = table.Columns[name];
                table.PrimaryKey = PrimaryKeyColumns;
            }
        }

        public byte[] ConvertImageToByteArray(System.Drawing.Image imageIn)
        {
            MemoryStream ms = new MemoryStream();
            imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
            return ms.ToArray();
        }

        public Image ConvertByteArrayToImage(int id)
        {
            MemoryStream ms = new MemoryStream((byte[])table.Rows.Find(id).ItemArray[2]);

            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }

        public Image ConvertByteArrayToImage(byte[] byteArrayIn)
        {
            MemoryStream ms = new MemoryStream(byteArrayIn);
            Image returnImage = Image.FromStream(ms);
            return returnImage;
        }
        #endregion Metodos de ayuda

        #region EventHandler
        private void Form4_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'testDataSet.T1' Puede moverla o quitarla según sea necesario.
            this.t1TableAdapter.Fill(this.testDataSet.T1);

            foreach (DataGridViewRow row in t1DataGridView.Rows)
            {
                row.Cells[0].Value = null;
            }
        }

        private void t1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            foreach (DataGridViewRow row in t1DataGridView.Rows)
            {
                if (table.Rows.Contains(row.Cells[1].Value))
                {
                    if ((table.Rows.Find((int)row.Cells[1].Value).ItemArray[1]).ToString() == "Delete")
                    {
                        t1BindingSource.RemoveCurrent();
                    }
                }
            }

            this.Validate();
            this.t1BindingSource.EndEdit();
            this.tableAdapterManager.UpdateAll(this.testDataSet);

            foreach (DataGridViewRow row in t1DataGridView.Rows)
            {
                row.Cells[0].Value = null;
            }

            table.Clear();
        }

        private void t1BindingSource_ListChanged(object sender, ListChangedEventArgs e)
        {
            DataRow row = table.NewRow();
            switch (e.ListChangedType.ToString())
            {
                case "ItemChanged":
                    row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                    row["NameAccion"] = "Edit";
                    row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Edit);
                    table.Rows.Add(row);
                    t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Edit;
                    break;

                case "ItemAdded":
                    row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                    row["NameAccion"] = "Add";
                    row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Add);
                    table.Rows.Add(row);
                    t1DataGridView.Rows[e.NewIndex].Cells[0].Value = (System.Drawing.Image)Resource1.Add;
                    break;

                // movido al evento clic del boton eliminar, con el objectivo de eliminar esta 
                // caracteristica del bindingsource e implementarlo de forma manual.
                //case "ItemDeleted":
                //    
                //    break;


                /* 
                 // no implementado
                 case "ItemMoved":

                 break;   
                 */

                default:
                    break;
            }
        }

        private void t1DataGridView_Sorted(object sender, EventArgs e)
        {
            if (table.Rows.Count > 0)
            {
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    if (table.Rows.Contains((Convert.ToInt32(row.Cells[1].Value))))
                    {
                        row.Cells[0].Value = ConvertByteArrayToImage((Convert.ToInt32(row.Cells[1].Value)));
                    }
                }
            }
        }

        private void bindingNavigatorDeleteItem_Click_1(object sender, EventArgs e)
        {
            DataRow row = table.NewRow();
            row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
            row["NameAccion"] = "Delete";
            row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Delete);
            table.Rows.Add(row);
            t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Delete;
        }
        #endregion EventHandler
    }
}
            
Descripcion:
  1. Creamos una tabla a nivel de clase el cual nos servira como repositorio para almacenar aqui la acciones realizada en la grilla.
  2. En el constructor del formulario invocamos el metodo DoColumn() el cual crea una tabla con el siguiente ezquema:
    • Una columna ID de tipo entero el cual servira como PK de la tabla para almacenar la PK de la grilla
    • Una columna de tipo string llamada NameAction el cual almacenara el nombre de la accion realizada en la grilla , Sus posible valores son: Add, Delete, Update
    • Unaa columna llamada imagen que representa graficamente la accion realizada en la fila de la grilla
      public GridMarkedActionForm()
              {
                  InitializeComponent();
      
                  DoColumn("ID", "System.Int32", true, true);
                  DoColumn("NameAccion", "System.String", false, false);
                  DoColumn("Image", "System.Byte[]", false, false);
              }
  3. El Metodo DoColumn
  4. declara como parameros formales:
    • String que represente el nombre de la columna: name.
    • String que represente el tipo de dato de la columna: type; Eemplo, "System.String".
    • Valor Booleano que especifca la columna como unica dentro de la tabla: unique.
    • Valor Booleano para determinar si la columna a crear sera la PK de la tabla: isprimary.
    private void DoColumn(string name, string type, bool unique, bool isprimary)
            {
                DataColumn column = new DataColumn(name);
                column.DataType = Type.GetType(type);
                column.Unique = unique;
                table.Columns.Add(column);
    
                if (isprimary)
                {
                    DataColumn[] PrimaryKeyColumns = new DataColumn[1];
                    PrimaryKeyColumns[0] = table.Columns[name];
                    table.PrimaryKey = PrimaryKeyColumns;
                }
            }
  5. El Metodo ConvertImageToByteArray() hace la conversion de System.Image a byte[] para almacenarla en la base de dato
  6. public byte[] ConvertImageToByteArray(System.Drawing.Image imageIn)
            {
                MemoryStream ms = new MemoryStream();
                imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
                return ms.ToArray();
            }
  7. El Metodo ConvertByteArrayToImage(), recupera el byte[] de la base de dato hace la conversion a System.Image para asignarselo a la filas de la grilla.
  8. public Image ConvertByteArrayToImage(int id)
            {
                MemoryStream ms = new MemoryStream((byte[])table.Rows.Find(id).ItemArray[2]);
    
                Image returnImage = Image.FromStream(ms);
                return returnImage;
            }
  9. En el Evento Load del formulario nos encargamos de que las filas tenga una imagen en blanco
  10. private void Form4_Load(object sender, EventArgs e)
            {
                // TODO: esta línea de código carga datos en la tabla 'testDataSet.T1' Puede moverla o quitarla según sea necesario.
                this.t1TableAdapter.Fill(this.testDataSet.T1);
    
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    row.Cells[0].Value = null;
                }
            }
  11. En el Evento Click del BindingNavigatorSaveItem colocamos el siguiente codigo, aqui es donde implementaremos la accion de eliminacion.:
    private void t1BindingNavigatorSaveItem_Click(object sender, EventArgs e)
            {
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    if (table.Rows.Contains(row.Cells[1].Value))
                    {
                        if ((table.Rows.Find((int)row.Cells[1].Value).ItemArray[1]).ToString() == "Delete")
                        {
                            t1BindingSource.RemoveCurrent();
                        }
                    }
                }
    
                this.Validate();
                this.t1BindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.testDataSet);
    
                foreach (DataGridViewRow row in t1DataGridView.Rows)
                {
                    row.Cells[0].Value = null;
                }
    
                table.Clear();
            }
    El cual se encarga de:
    • Procesar cada una de la fila de la grilla para verificar que el valor de la celda uno(1) el cual corresponde al PK de la grilla este contenido dentro de la tabla de repositorio; de ser cierto, busco dentro de la coleccion de fila de la tabla de repositorio la fila que contenga el valor especificado por medio del valor de la celda uno(1) que coresponde al valor de la PK de la grilla en la fila actual, descompongo la fila obtenida en cada uno de sus campos o columnas mediante el uso de DataRow.ItemArray (Propiedad) obtengo en valor del campo o columna uno(1) que corresponde al NameAction de la tabla y lo comparo con el NameAction == "Delete", de ser afirmativo procedemos a eliminar la fila actual de la grilla mediante la invocacion de BindingSource.RemoveCurrent (Método)
      foreach (DataGridViewRow row in t1DataGridView.Rows)
                  {
                      if (table.Rows.Contains(row.Cells[1].Value))
                      {
                          if ((table.Rows.Find((int)row.Cells[1].Value).ItemArray[1]).ToString() == "Delete")
                          {
                              t1BindingSource.RemoveCurrent();
                          }
                      }
                  }
    • Valido los controles modificado
      his.Validate();
    • Aplica los cambios pendientes al origen de datos subyacente
      this.t1BindingSource.EndEdit();
    • Envio todos los cambios al Dataset
      this.tableAdapterManager.UpdateAll(this.testDataSet);
    • Limpioi la imagen de la filas
      foreach (DataGridViewRow row in t1DataGridView.Rows)
                  {
                      row.Cells[0].Value = null;
                  }
    • Elimino los valores de la tabla
      table.Clear();
  12. En el Evento ListChanged del BindingSource colocamos el siguiente codigo:
    private void t1BindingSource_ListChanged(object sender, ListChangedEventArgs e)
            {
                DataRow row = table.NewRow();
                switch (e.ListChangedType.ToString())
                {
                    case "ItemChanged":
                        row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                        row["NameAccion"] = "Edit";
                        row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Edit);
                        table.Rows.Add(row);
                        t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Edit;
                        break;
    
                    case "ItemAdded":
                        row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                        row["NameAccion"] = "Add";
                        row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Add);
                        table.Rows.Add(row);
                        t1DataGridView.Rows[e.NewIndex].Cells[0].Value = (System.Drawing.Image)Resource1.Add;
                        break;
    
                    // movido al evento clic del boton eliminar, con el objectivo de eliminar esta 
                    // caracteristica del bindingsource e implementarlo de forma manual.
                    //case "ItemDeleted":
                    //    
                    //    break;
    
    
                    /* 
                     // no implementado
                     case "ItemMoved":
    
                     break;   
                     */
    
                    default:
                        break;
                }
            }
    En el cual testeamos ListChangedEventArgs.ListChangedType (Propiedad)  para obtener el tipo de cambio realizado en el control, creamos una nueva filas con el PK de la grilla, un NameAction == "a la accion corespondiente", su respectiva imagen y la agregamos a la coleccion de filas de la tabla de repositorio
  13. En el evento sorted de la grilla nos aseguramo de las imagenes se corespondan no importando por que columna se ordenen las filas, pero ante confirmamos que nuestra tabla de repositorio contenga filas esto no garantiza de que si hubo cambio en la grilla.
    private void t1DataGridView_Sorted(object sender, EventArgs e)
            {
                if (table.Rows.Count > 0)
                {
                    foreach (DataGridViewRow row in t1DataGridView.Rows)
                    {
                        if (table.Rows.Contains((Convert.ToInt32(row.Cells[1].Value))))
                        {
                            row.Cells[0].Value = ConvertByteArrayToImage((Convert.ToInt32(row.Cells[1].Value)));
                        }
                    }
                }
            }
  14. En el evento click del control bindingNavigatorDeleteItem del BindingNavigator, no eliminamos la filas sino mas bien, la marcamos con la imagen de eliminacion, pero antes creamos una nueva filas con el PK de la grilla, un NameAction == "Delete", y la imagen corespondiente a la eliminacion y la agregamos a la coleccion de filas de la tabla de repositorio
    private void bindingNavigatorDeleteItem_Click_1(object sender, EventArgs e)
            {
                DataRow row = table.NewRow();
                row["ID"] = (int)t1DataGridView.CurrentRow.Cells[1].Value;
                row["NameAccion"] = "Delete";
                row["Image"] = ConvertImageToByteArray((System.Drawing.Image)Resource1.Delete);
                table.Rows.Add(row);
                t1DataGridView.CurrentRow.Cells[0].Value = (System.Drawing.Image)Resource1.Delete;
            }
  • Nos restaria Agregar Menu contextuales a las filas de la grilla para deshacer los cambios realizado por filas separada
  • Agregar al Toolbox los botones para Deshacer y Reahacer