用`List <t>`进行数据绑定

时间:2018-08-15 02:56:17

标签: c# .net reference-type

我写了一个小程序来记录数据更改,它使用DataGridView,并且它的数据源是一个List,但是我对DataBingding有疑问。

DataTable dataTable = GetBalance();
List<StockBalance> balances = ReadDataTable(dataTable);
List<StockBalance> stockBalances = (List<StockBalance>)dataGridView1.DataSource ?? new List<StockBalance>();
stockBalances.AddRange(balances);
dataGridView1.DataSource = stockBalances;

上面的代码无法刷新DataGridView,而stockBalances包含所有新数据时,余额表中的数据将不会显示在DataGridView中,但是下面的代码可以归档:

balances.AddRange(stockBalances);
dataGridView1.DataSource = balances;

我想原因是List和StockBalance是引用类型,但是我不知道如何验证它,不是吗?

希望有人可以帮助我,谢谢。

2 个答案:

答案 0 :(得分:1)

Y=as.factor(rep(c(1,2), times=14)) X=matrix(runif(length(Y)*100), nrow=length(Y)) library(e1071) library(pROC) colnames(X)=1:ncol(X) iter=1000 ansMat=matrix(NA,length(Y),iter) for(i in seq(iter)){ #get train train=sample(seq(length(Y)),0.5*length(Y)) if(min(table(Y[train]))==0) next #test from train test=seq(length(Y))[-train] #train model XX=X[train,] YY=Y[train] mod=svm(XX,YY,probability=FALSE) XXX=X[test,] predVec=predict(mod,XXX) RFans=attr(predVec,'decision.values') ansMat[test,i]=as.numeric(predVec) } ans=rowMeans(ansMat,na.rm=TRUE) r=roc(Y,ans)$auc print(r) (实际上是任何绑定控件)都需要在数据更改时从数据源接收通知,以便知道它需要更新。这需要一个实现DataGridView接口的对象。 IBindingList没有实现该接口,因此网格不知道列表中的数据何时更改,因此不更新。

您应该做的是将列表绑定到List<T>,然后将其绑定到网格。在这种情况下,当您更改列表时,您可以调用BindingSource的适当方法,例如BindingSource,以向网格提供适当的通知。

请注意,当我说“通知”时,是指一个事件。 ResetBindings对象引发其IBindingList事件,然后控件处理该事件。

答案 1 :(得分:0)

您可以使用 Binding source

var source = new BindingSource();
List<StockBalance> balances = ReadDataTable(dataTable);
List<StockBalance> stockBalances = (List<StockBalance>)dataGridView1.DataSource ?? new List<StockBalance>();
stockBalances.AddRange(balances);

 source.DataSource = stockBalances;
 dataGridView1.AutoGenerateColumns=true;
 dataGridView1.DataSource = source;