如何在C#中的BindingList中移动项目?比如说,将最后添加的项目移到前面,或者与之前的项目交换?
当我尝试删除datagridview中的最后一项时,我收到以下消息.
DataBinding在列表中找不到适合所有绑定的行.
我的绑定设置如下.
ExtendedBindingList<MyClass> bl = new ExtendedBindingList<MyClass>(GetDataFromDB());
BindingSource bs = new BindingSource();
bs.DataSource = bl;
dgv.DataSource = bs;
Run Code Online (Sandbox Code Playgroud)
ExtendedBindingList只是简单的东西,我把它们放在一起实现排序和过滤以及一些基本的状态持久性.dgv是DataGridView.GetDataFromDB返回MyClass的List.
只有在我尝试使用以下方法从datagridview中删除最后一项时才会出现此问题:
bs.RemoveCurrent();
Run Code Online (Sandbox Code Playgroud)
其他所有时间都有效.我唯一提示解决方案是删除所有绑定并重新应用它们,但这似乎不是一个理想的解决方案.
编辑 只有在BindingList成功删除最后一个项目后才会抛出异常.它被外部代码抛出,所以我无法准确地告诉它究竟是什么抛出它.
所以,我在这里,请求一些帮助:).
提前谢谢,贾斯汀
是否可以将IEnumerable列表转换为BindingList集合?
IEnumerable列表是类型化对象的列表,例如:
IEnumerable<AccountInfo> accounts = bll.GetAccounts(u.UserName, u.Password);
Run Code Online (Sandbox Code Playgroud)
而我的PagingList只是扩展了BindingList:
public class PagingList<T>
{
public BindingList<T> Collection { get; set; }
public int Count { get; set; }
public PagingList()
{
Collection = new BindingList<T>();
Count = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我只是想将我的IEnumerable列表传递给一个使用我的PagingControl呈现列表的方法:
protected void RenderListingsRows(PagingList<AccountInfo> list)
{
foreach (var item in list)
{
//render stuff
}
}
Run Code Online (Sandbox Code Playgroud)
但似乎我不能在两者之间施展,任何人都可以指出我错过了什么?!
非常感谢
本
我一直在努力寻找问题的可能原因,但我似乎无法找到它:
错误:
System.NotSupportedException:Collection是只读的.System.ThrowHelper.ThrowNotSupportedException(ExceptionResource资源)位于C:\ Users\aRJiJon\Documents\Visual中WindowsFormsApplication1.Form1.Btn_CSVSEATINGPLAN_Click(Object sender,EventArgs e)的System.Collections.ObjectModel.Collection`1.Add(T item) Studio 2010\Projects\WindowsFormsApplication_1\WindowsFormsApplication1\Form1.cs:第72行
this.dataGridView1.DefaultCellStyle.Font = new Font("Tahoma", 11);
bindingCSVSP.DataSource = CSV_Seating_Plan;
bindingCSVSP.AllowNew = true;
CSV_Seating_Plan.AllowNew = true;
CSV_Seating_Plan.AllowRemove = true;
CSV_Seating_Plan.RaiseListChangedEvents = true;
CSV_Seating_Plan.AllowEdit = true;
this.dataGridView1.DataSource = bindingCSVSP;
this.btn_Process_SP.Enabled = true;
CSV_Seating_Plan.Add(new csv_SeatingPlan());
public string examperiod;
[FieldConverter(ConverterKind.Date, "dd/mm/yyyy")]
public DateTime date_Exam;
public string time;
public string exam_Code;
public string id_Student;
public string name_Student;
public string candidatenum_Student;
public string seat_num;
public string _WSS_EXEC;
public string exam_loc;
#region getsetmethods.
public string EXAMPERIOD
{ get { …Run Code Online (Sandbox Code Playgroud) 我有BindingList对象,它与DataGridView一起使用.
BindingList<FilesToProcessDataModels> Listfiles = new BindingList<FilesToProcessDataModels>();
dataGridFiles.DataSource = Listfiles;
Run Code Online (Sandbox Code Playgroud)
我想按照Where中的给定条件过滤项目列表.如下:
dataGridSheets.DataSource = Listfiles.Where(i => i.Status == FileStatus.NotProcessed).ToList();
Run Code Online (Sandbox Code Playgroud)
上面的代码工作正常,但我想将过滤器resut分配给相同类型的对象[Listfiles]而不是datagrid,
当我这样做时:
Listfiles = Listfiles.Where(i => i.Status == FileStatus.NotProcessed).ToList();
Run Code Online (Sandbox Code Playgroud)
它给了以下的erorr
[无法将类型'System.Collections.Generic.List隐式转换为BindingList']
如何将通用列表转换为BindingList<FilesToProcessDataModels>?
我有我的enumHelper类包含这些:
public static IList<T> GetValues()
{
IList<T> list = new List<T>();
foreach (object value in Enum.GetValues(typeof(T)))
{
list.Add((T)value);
}
return list;
}
Run Code Online (Sandbox Code Playgroud)
和
public static string Description(Enum value)
{
Attribute DescAttribute = LMIGHelper.GetAttribute(value, typeof(DescriptionAttribute));
if (DescAttribute == null)
return value.ToString();
else
return ((DescriptionAttribute)DescAttribute).Description;
}
Run Code Online (Sandbox Code Playgroud)
我的枚举是这样的:
public enum OutputType
{
File,
[Description("Data Table")]
DataTable
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.所有以前的工作都很好.现在我想添加一个新的帮助器来返回BindingList>,所以我可以将任何枚举链接到任何组合使用
BindingList<KeyValuePair<OutputType, string>> list = Enum<OutputType>.GetBindableList();
cbo.datasource=list;
cbo.DisplayMember="Value";
cbo.ValueMember="Key";
Run Code Online (Sandbox Code Playgroud)
为此,我补充说:
public static BindingList<KeyValuePair<T, string>> GetBindingList()
{
BindingList<KeyValuePair<T, string>> list = new BindingList<KeyValuePair<T, string>>();
foreach (T value …Run Code Online (Sandbox Code Playgroud) 我想在将项添加到BindingList之前进行一些处理.我看到有一个ListChanged事件,但在添加项目后会触发此事件.只有在调用AddNew方法(而不是Add方法)时才会触发AddingNew事件.以前有人做过这样的事吗?
更新:
我创建了以下类,当在IList上调用Add方法时,我的新Add方法被触发.那么,我是否有其他地方读过的铸造问题?如果我从集合中删除了ISpecialCollection接口,则不会调用我的Add方法.有人可以解释为什么它的行为不同吗?如果我使用ISpecialCollection <接口,是否会出现转换问题?
public interface ISpecialCollection<T> : IList<T>
{
}
public class SpecialCollection<T> : BindingList<T>, ISpecialCollection<T>
{
public new void Add (T item)
{
base.Add(item);
}
}
class Program
{
static void Main(string[] args)
{
IList<ItemType> list = new SpecialCollection<ItemType>();
list.Add(new ItemType());
}
}
Run Code Online (Sandbox Code Playgroud) 我已经在http://msdn.microsoft.com/en-us/library/aa480736.aspx上实现了SortableSearchableList类,并为它添加了一个Sort方法,如下所示:
public void Sort(PropertyDescriptor prop, ListSortDirection direction)
{
ApplySortCore(prop, direction);
}
Run Code Online (Sandbox Code Playgroud)
这个类在通过单击任何列标题对DataGridView进行排序时起作用,但是我需要能够以编程方式调用指定列的Sort方法(在本例中使用sortButton控件).我在网上找到的几个代码示例建议获取列的PropertyDescriptor并将其传递给ApplySortCore方法.我还没有那个工作.我可以获取DataGridView或SortableSearchableList的PropertyDescriptorCollection属性,但似乎无法获取Find方法来获取指定列/成员的PropertyDescriptor.这是我的其余代码:
namespace SortableBindingListTest
{
public partial class Form1 : Form
{
private SortableSearchableList<Tags> alarms = new SortableSearchableList<Tags>();
public Form1()
{
InitializeComponent();
alarms.Add(new Tags("some text", "1"));
alarms.Add(new Tags("more text", "2"));
alarms.Add(new Tags("another one", "3"));
dataGridView1.AutoGenerateColumns = false;
dataGridView1.AllowUserToAddRows = true;
dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
dataGridView1.RowHeadersVisible = false;
dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
DataGridViewTextBoxColumn alarmColumn = new DataGridViewTextBoxColumn();
alarmColumn.DataPropertyName = "Alarm";
alarmColumn.Name = "Alarm";
alarmColumn.HeaderText = "Alarm";
DataGridViewTextBoxColumn messageColumn = new DataGridViewTextBoxColumn(); …Run Code Online (Sandbox Code Playgroud) 我想在每行的末尾有一个删除按钮,DataGridView然后单击我要从绑定列表中删除所需的行,该列是我的网格的数据源.
但我似乎无法做到这一点我在产品类中创建了一个按钮对象,并使用唯一的id实例化它以从列表中删除该对象.但是按钮没有显示在行中.
表单中有TextBox,用户可以输入文本,当他们按下Add按钮时,产品的新对象将使用提供的字段进行实例化,然后将其添加到BindingList.
最后,这个列表被绑定到,DataGridView并且细节显示在网格中.(我已经完成了这一部分).
最后,通过单击"保存"按钮,列表将保存在数据库中.
public class Product{
public string Brand { get; set; }
public int ProductPrice { get; set; }
public int Quantity { get; set; }
public product(string brand,int productPrice, int quantity){
this.Brand = brand;
this.ProductPrice = productPrice;
this.Quantity = quantity;
}
}
public partial class MainForm: Form{
.....
BindingList<Product> lProd = new BindingList<Product>();
private void btnAddProduct_Click(object sender, EventArgs e){
string Brand = txtProBrand.Text;
int Price = Convert.ToInt32(txtPrice.Text);
int Quantity = …Run Code Online (Sandbox Code Playgroud) 我刚刚学习 C#/.NET,我遇到了这个问题。
所以在我的解决方案中,我有 2 个项目:winforms UI 和带有逻辑的 dll。在 dll 中,我有 BindingList,它为 UI 中的 listBox 提供数据源。
用户界面:
public partial class Form1 : Form
{
private Class1 _class1;
public Form1()
{
InitializeComponent();
_class1 = new Class1(); // logic class insatce
listBox1.DataSource = _class1.BindingList;
}
private void button1_Click(object sender, EventArgs e)
{
_class1.Add();
}
private void button2_Click(object sender, EventArgs e)
{
_class1.Remove();
}
}
Run Code Online (Sandbox Code Playgroud)
逻辑类:
public class Class1
{
public BindingList<string> BindingList { get; set; } = new BindingList<string>() ;
public void Add() …Run Code Online (Sandbox Code Playgroud) bindinglist ×10
c# ×10
winforms ×5
data-binding ×2
datagridview ×2
.net ×1
collections ×1
enums ×1
events ×1
generic-list ×1
generics ×1
ienumerable ×1
listbox ×1