problema al eliminar y agregar registros d radGridView

Iniciado por SAGA-gl, 5 Mayo 2015, 01:03 AM

0 Miembros y 1 Visitante están viendo este tema.

SAGA-gl

slds gente dl foro.....verán en el sig código tengo q hcer una modificación en una base d datos...primero hgo la consulta del nro de orden y m trae los datos d esa orden al radGridView....el problema es que no puedo eliminar algún renglón d ese radGrid y tampoco añadirles....m salta un error q es d solo lectura (y ya cambie la propiedad ReadOnly) y para agregar filas RadListSource necesito un constructor sin parámetros para System.Data.DataRowView....debo hcr algo en la datatable? muchas grax d antemano
Código (csharp) [Seleccionar]
[/using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using Telerik.WinControls;
using Telerik.WinControls.UI;

namespace RegistrarOCspp2
{
    public partial class ModificarOCspp2 : Form
    {
        public ModificarOCspp2()
        {
            InitializeComponent();
        }
        private SqlConnection conexion;
        private SqlDataAdapter adaptador;

        private void ModificarOCspp2_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'proyectoSaludDataSet5.medicamentos1' Puede moverla o quitarla según sea necesario.
            this.medicamentos1TableAdapter1.Fill(this.proyectoSaludDataSet5.medicamentos1);
            // TODO: esta línea de código carga datos en la tabla 'proyectoSaludDataSet4.medicamentos1' Puede moverla o quitarla según sea necesario.
            this.medicamentos1TableAdapter.Fill(this.proyectoSaludDataSet4.medicamentos1);
            conexion = new SqlConnection("Data Source=GONZALOCABRERA\\SQLEXPRESS;Initial Catalog=ProyectoSalud;Integrated Security=True");
            adaptador = new SqlDataAdapter();
        }

        private void radButton1_Click(object sender, EventArgs e)
        {
            conexion = new SqlConnection("Data Source=GONZALOCABRERA\\SQLEXPRESS;Initial Catalog=ProyectoSalud;Integrated Security=True");
            if (txtNro.Text == "")
            {
                RadMessageBox.SetThemeName("ATENCION");
                DialogResult ds = RadMessageBox.Show(this, "DEBE INGRESAR UN NRO DE ORDEN", "ATENCION", MessageBoxButtons.OK, RadMessageIcon.Exclamation);
                this.Text = ds.ToString();
            }
            else
                if (txtNro.Text != "")
                {
                    conexion.Open();
                    SqlCommand consulta = new SqlCommand("select Convert(varchar(10),fecIni,103) as fecIni ,Convert(Varchar(10),fecFin,103) as fecFin from ordenes where nro_orden=@nro", conexion);
                    consulta.Parameters.AddWithValue("@nro", Convert.ToInt32(txtNro.Text));
                    SqlDataReader registro = consulta.ExecuteReader();

                    if (registro.Read())

                    {
                        rdt1.Enabled = true;
                        rdt2.Enabled = true;
                        txtCant.Enabled = true;
                        txtPrecio.Enabled = true;
                        txtProg.Enabled = true;
                        comboMed.Enabled = true;
                        radButton3.Enabled = true;
                        rdt1.Text = Convert.ToString(registro["fecIni"]);
                        rdt2.Text = Convert.ToString(registro["fecFin"]);
                        radButton5.Enabled = true;
                       
                    }
                    else
                    {
                        RadMessageBox.SetThemeName("ATENCION");
                        DialogResult ds = RadMessageBox.Show(this, "LA ORDEN INGRESADA NO SE ENCUENTRA REGISTRADA", "ATENCION", MessageBoxButtons.OK, RadMessageIcon.Exclamation);
                        this.Text = ds.ToString();
                       
                    }

            conexion.Close();
           
            conexion.Open();
            SqlCommand consulta2 = new SqlCommand("SELECT dbo.DetalleOrden.medicamento, dbo.DetalleOrden.cantidad, dbo.DetalleOrden.programa, dbo.DetalleOrden.precioUnit,dbo.DetalleOrden.precioFinal FROM dbo.ordenes INNER JOIN dbo.DetalleOrden ON dbo.ordenes.nro_orden = dbo.DetalleOrden.nro_orden WHERE (dbo.ordenes.nro_orden = @nro)", conexion);
            consulta2.Parameters.AddWithValue("@nro", Convert.ToInt32(txtNro.Text));
            SqlDataReader registro2 = consulta2.ExecuteReader();
            DataTable dt = new DataTable();
            dt.Columns.Add("1");
            dt.Columns.Add("2");
            dt.Columns.Add("3");
            dt.Columns.Add("4");
            dt.Columns.Add("5");
            while(registro2.Read())
            {
                dt.Rows.Add(registro2["medicamento"], registro2["cantidad"], registro2["programa"], registro2["precioUnit"], registro2["precioFinal"]);
            }

            adaptador = new SqlDataAdapter(consulta2);
           
         
            rgv.Columns[0].FieldName = "1";
            rgv.Columns[1].FieldName = "2";
            rgv.Columns[2].FieldName = "3";
            rgv.Columns[3].FieldName = "4";
            rgv.Columns[4].FieldName = "5";
           
            rgv.DataSource = dt.DefaultView.AsParallel();
           

           
            conexion.Close();
                     
            }
                 
           
        }

        private void radButton4_Click(object sender, EventArgs e)
        {
            DialogResult result = RadMessageBox.Show(this, "SEGURO QUE DESEA SALIR?", "SALIR", MessageBoxButtons.OKCancel);
            RadMessageBox.SetThemeName("ATENCION");
            this.Text = result.ToString();

            if (result == DialogResult.OK)
            {
                ConsultarOCspp2 c = new ConsultarOCspp2();
                this.Close();
            }
            else if (result == DialogResult.Cancel)
            {

            }
        }

        private void radButton5_Click(object sender, EventArgs e)
        {
            foreach (GridViewRowInfo row in rgv.SelectedRows)
            {
                rgv.Rows.Remove(row);
            }
        }

        private void radButton2_Click(object sender, EventArgs e)
        {

        }
        private void radButton3_Click_1(object sender, EventArgs e)
        {
            if (txtCant.Text == "" || txtProg.Text == "" || txtPrecio.Text == "")
            {
                RadMessageBox.SetThemeName("ATENCION");
                DialogResult ds = RadMessageBox.Show(this, "DEBE COMPLETAR TODOS LOS CAMPOS", "ATENCION", MessageBoxButtons.OK, RadMessageIcon.Exclamation);
                this.Text = ds.ToString();

            }
            else

                if (txtCant.Text != "" || txtProg.Text != "" || txtPrecio.Text != "")
                {

                    string medicamento = comboMed.Text;
                    int cantidad = int.Parse(txtCant.Text);
                    string programa = txtProg.Text;
                    float precio = float.Parse(txtPrecio.Text);
                    rgv.Rows.Add(medicamento, cantidad, programa, precio, cantidad * precio);
                    radButton5.Enabled = true;

                }
        }

               }
    }code]

Eleкtro

#1
Hay dos problemas en el código que has mostrado.

El primer problema es que estás intentando modificar una secuencia paralela, que al asignarla cómo datasource es de solo lectura.
Citar
Código (csharp,2) [Seleccionar]
...
rgv.DataSource = dt.DefaultView.AsParallel();
...

Y el segundo problema es que estás intentando modificar dos colecciones que están sincronizadas entre sí (RadGridView.Rows <> RadGridView.SelectedRows):
Citar
Código (csharp,2) [Seleccionar]
...
foreach (GridViewRowInfo row in rgv.SelectedRows)
...




Solución al primer problema es no usar el paralelismo ya que tienes pensado modificar la colección.
Código (csharp) [Seleccionar]
...
rgv.DataSource = dt.DefaultView
...


Solución al segundo problema es desactivar las notificaciones del control/colecciones.
Código (csharp) [Seleccionar]

using (RadGridView1.DeferRefresh())
{
foreach (GridViewRowInfo row in RadGridView1.SelectedRows) {
RadGridView1.Rows.Remove(row);
}
}  // El método RadGridView.DeferRefresh() internamente es lo mismo que utilizar RadGridView.BeginUpdate() + RadGridView.EndUpdate(), pero de un modo elegante.


Saludos








SAGA-gl

perdón elektro justo estaba escribiendo el post para contar q solucione el primer problema(el de añadir filas)cuando vi tu respuesta pero keria compartir el código xa ver tu opinion:
Código (csharp) [Seleccionar]
private void radButton3_Click_1(object sender, EventArgs e)
        {
            if (txtCant.Text == "" || txtProg.Text == "" || txtPrecio.Text == "")
            {
                RadMessageBox.SetThemeName("ATENCION");
                DialogResult ds = RadMessageBox.Show(this, "DEBE COMPLETAR TODOS LOS CAMPOS", "ATENCION", MessageBoxButtons.OK, RadMessageIcon.Exclamation);
                this.Text = ds.ToString();

            }
            else

                if (txtCant.Text != "" || txtProg.Text != "" || txtPrecio.Text != "")
                {

                    string medicamento = comboMed.Text;
                    int cantidad = int.Parse(txtCant.Text);
                    string programa = txtProg.Text;
                    float precio = float.Parse(txtPrecio.Text);
                    float precFinal = cantidad * precio;
                    dt.Rows.Add(medicamento,cantidad,programa,precio,precFinal);
                    rgv.DataSource = dt;
                    radButton5.Enabled = true;

                }
en cuanto al segundo problema pondré en practica ahora mismo tu solución 1000000 d grax y perdón x las molestias....slds!

SAGA-gl

m salio el mismo error d solo lectura.....m falta algo?
Código (csharp) [Seleccionar]
private void radButton5_Click(object sender, EventArgs e)
        {
            using (rgv.DeferRefresh())
            {
                foreach (GridViewRowInfo row in rgv.SelectedRows)
                {
                    rgv.Rows.Remove(row);
                }
            }
           
           
        }

Eleкtro

#4
Que raro.

Especifica el tipo de excepción, y el mensaje exacto de error.

Comprueba el valor de la propiedad dt.Rows.IsReadonly y del rgv.Rows.IsReadOnly antes de iterar la colección, ¿alguno es True? :-\.

En caso afirmativo, no se por que te sucede eso, pero para intentar solucionarlo no intentes eliminar las filas del rgv, declara el dt fuera de método y modifica el rgv.DataSource (es decir, elimina las filas directamente en el dt), los cambios se verán reflejados en el rgv.

Prueba así:
Código (vbnet) [Seleccionar]
Dim dt As DataTable
Dim dtCopy As DataTable

Private Sub test()

   dt = New DataTable
   ' añadir columnas, añadir filas...

   dtCopy = dt.Copy()
   rgv.DataSource = dtCopy.DefaultView

End Sub

Private Sub RadButton1_Click(sender As Object, e As EventArgs) _
Handles RadButton1.Click

   If dtCopy.Rows.IsReadOnly() Then
       Throw New Exception("dtCopy row col es de solo lectura")

   ElseIf rgv.Rows.IsReadOnly Then
       Throw New Exception("rgv row col es de solo lectura")

   Else
       Using rgv.DeferRefresh()

           For Each row As GridViewRowInfo In rgv.SelectedRows.ToArray
               dtCopy.Rows.Remove(DirectCast(row.DataBoundItem, DataRowView).Row)
           Next row

       End Using

   End If

End Sub


Código (csharp) [Seleccionar]
DataTable dt;
DataTable dtCopy;

private void test()
{
dt = new DataTable();
// añadir columnas, añadir filas...

dtCopy = dt.Copy();
rgv.DataSource = dtCopy.DefaultView;
}

private void RadButton1_Click(object sender, EventArgs e)
{
if (dtCopy.Rows.IsReadOnly()) {
throw new Exception("dtCopy row col es de solo lectura");

} else if (rgv.Rows.IsReadOnly) {
throw new Exception("rgv row col es de solo lectura");

} else {
using (rgv.DeferRefresh()) {
foreach (GridViewRowInfo row in rgv.SelectedRows.ToArray) {
dtCopy.Rows.Remove(((DataRowView)row.DataBoundItem).Row);
}
}
}
}








SAGA-gl

buenas noches ha funcionado a la perfeccion.........se q me vas a regañar xq va contra las reglas del foro pero MUCHISIMAS GRACIAS ELEKTRO

Eleкtro

Cita de: SAGA-gl en  6 Mayo 2015, 06:45 AMse q me vas a regañar xq va contra las reglas del foro pero MUCHISIMAS GRACIAS ELEKTRO

Sería incapaz de "regañar" por ese motivo, no soy un monstruo, jaja. Es cierto que esa norma existe peeeeeeeero... es un tabú :P.

Me alegro de que te haya servido de ayuda.

PD: Eso si, intenta marcar tus temas cómo resueltos utilizando el icono de .

Saludos!