2009-04-02 24 views
5

¿Cómo eliminar elementos seleccionados de ListBox cuando se le asigna una fuente de datos en C#?¿Cómo eliminar elementos seleccionados de ListBox cuando se le asigna una fuente de datos en C#?

Cuando se trata de eliminar, ha obtenido un error

"colección de artículos que no se puede modificar cuando la propiedad DataSource se establece."


Pero cuando intento eliminar el elemento del origen de datos (tabla de datos),

que thorws de error como "DataRow no está en la colección fila actual".

Respuesta

9

Encuentra ese elemento en el objeto DataSource y quítalo, luego vuelve a enlazar el ListBox.

EDITAR:

es como se elimina de un DataTable como su fuente de datos, independientemente de la versión .NET aquí.

DataRowView rowView = listBox.SelectedItem as DataRowView; 

if (null == rowView) 
{ 
    return; 
} 

dt.Rows.Remove(rowView.Row); 

No he probado con otra cosa que WinForms DataGridViews, pero recomiendo altamente BindingListView, que es tanto más rápido que DataTables/Vistas y le permite enlazar lista genérica <T> s como su fuente de datos.

+0

Pero cuando intento eliminar el elemento del origen de datos (tabla de datos), que thorws de error como "DataRow no está en la colección fila actual". – Dhana

+0

¿Es esto WinForms o ASP.NET? ¿Qué versión del framework .NET estás usando? –

0

Si el cuadro de lista se ha asignado una fuente de datos, debe eliminar elementos de la fuente de datos y luego volver a enlazar el ListBox

0

Es necesario modificar el origen de datos en lugar de la colección de elementos del control. Dependiendo del tipo de fuente de datos a la que se está vinculando, va a haber diferentes cosas que debe hacer para que su UI se actualice.

La mejor manera es encontrar una colección que se adapte a sus necesidades e implemente IBindingList o IBindingListView. Esas dos interfaces implementan controladores pares que escuchan un evento CollectionChanged y actualizan su UI en consecuencia.

Si su colección no es compatible con esas interfaces, tendrá que volver a enlazar su fuente de datos cada vez que alguien agrega/elimina un elemento.

2

Como alternativa, use una lista que implemente IBindingList o herede de BindingList. Cuando los objetos se agregan o eliminan de una lista vinculante, los controles vinculados a ella se notifican automáticamente del cambio y se actualizarán en consecuencia. Si está utilizando BindingList y su clase también implementa INotifyProperty cambiado, cualquier cambio en las propiedades de la clase también se actualizará automáticamente en el control de enlace de datos. Por ejemplo, si una columna en una cuadrícula de datos (vista) está vinculada a una propiedad, "Nombre", y cambia "Nombre" en la fuente de datos, la cuadrícula de datos se actualizará automáticamente. Si agrega un nuevo elemento a la fuente de datos, la cuadrícula de datos se actualizará automáticamente. La lista de enlace también admite notificaciones en la otra dirección. Si un usuario edita el campo "Nombre" en una cuadrícula de datos, el objeto enlazado se actualizará automáticamente. Saliendo ligeramente del tema, si va un poco más allá e implica "SupportsSortingCore" y los métodos asociados en BindingList, puede agregar la clasificación automática a sus datos. Al hacer clic en un encabezado de columna, se ordenará automáticamente la lista y se mostrará la flecha de dirección de clasificación del encabezado.

0

es simple, asigne un nuevo valor en blanco a listbox por ejemplo ..

Dim ABC Como Nueva lista (de cadena)()

ListBox1.DataSource = ABC

0

hay micrófonos aplicación ListBox, es necesario crear una nueva instancia de origen de datos para el componente a que se reconoce una cambio.

Ej:

ActivitiesList.DataSource = _activities; 

_activities = new List<Activity>(_activities); 
_activities.Remove((Activity)ActivitiesList.SelectedItem); 

ActivitiesList.DataSource = _activities; 
1

al recibir el mensaje "colección de productos que no se puede modificar cuando la propiedad DataSource se establece." estableciendo el origen de datos en otra cosa, lista vacía o nulo no ayuda cuando el código initializecomponent no está completo.

para evitar ese error, uno debe hacer el cambio de origen de datos o la lista de elementos durante o después de la carga del formulario.

Sé que no parece tener sentido. Sin embargo, el diseñador de estudio visual generará código en la forma designer.cs o vb que agregará elementos al cuadro de lista si se encuentra algún código que cambie los elementos antes de finalizar la inicialización de componentes

0

Mientras Chris Doggett publicó una solución válida, Me encontré con problemas mientras lo usaba. Al usar ese método, no permitía que un GetChanges (DataRowState.Deleted) posterior funcionara correctamente.

Para resolver mejor mi problema, solo tuve que cambiar una sola línea, la última línea.

DataRowView rowView = listBox.SelectedItem as DataRowView; 

if (null == rowView) 
{ 
    return; 
} 

rowView.Row.Delete(); 

Esto permitió que mi llamada a GetChanges funcionara correctamente.

0

Esto funcionó para mí

 DataTable temp = (DataTable)lstBlocks.DataSource; 
     temp.Rows.RemoveAt(position); 
Cuestiones relacionadas