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
[/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]
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...
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...
foreach (GridViewRowInfo row in rgv.SelectedRows)
...
Solución al primer problema es no usar el paralelismo ya que tienes pensado modificar la colección.
...
rgv.DataSource = dt.DefaultView
...
Solución al segundo problema es desactivar las notificaciones del control/colecciones.
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
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: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!
m salio el mismo error d solo lectura.....m falta algo?
private void radButton5_Click(object sender, EventArgs e)
{
using (rgv.DeferRefresh())
{
foreach (GridViewRowInfo row in rgv.SelectedRows)
{
rgv.Rows.Remove(row);
}
}
}
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í:
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
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);
}
}
}
}
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
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 (http://foro.elhacker.net/Themes/default/images/post/topicsolved.gif).
Saludos!