我写了一个小程序来记录数据更改,它使用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是引用类型,但是我不知道如何验证它,不是吗?
希望有人可以帮助我,谢谢。
答案 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;