【发布时间】:2021-09-15 20:15:55
【问题描述】:
我仍然很困惑如何在更改 DataSource 的内容而不显式触发 DataGridView.Update() 时自动更新 DataGridView。 DataTable、List、BindingList 作为(直接)DataSource 和作为(间接)DataSource 之间似乎没有任何区别,另外还有一个 BindingSource,它使用前者中的任何一个作为 DataSource。
我实际使用的 DataGridView 是不可编辑的,只显示由相应实体代码更新的条目。我的最后一次尝试是使用 BindingSource,它使用 BindingList 并在代码中操作 BindingSource 的内容。
这里省略了一些方法,对基本问题没有作用。
表格:
private void FormLog_Load(object sender, EventArgs e) {
...
dgvLog.DataSource = Log.Current.SourceEntries;
...
}
private void ClearLog() {
Log.Current.RemoveAll();
}
public void UpdateDataSource() {
dgvLog.Update();
}
实体(单例类):
public class LogEntry {
public int ID { get; set; }
public string DateTime { get; set; }
public string Type { get; set; }
public string Event { get; set; }
public string Details { get; set; }
}
public class Log {
public BindingList<LogEntry> Entries { get; set; }
public BindingSource SourceEntries { get; set; }
public Log() {
Entries = new BindingList<LogEntry>();
SourceEntries = new BindingSource() { DataSource = Entries };
ReadAll();
}
public void Add(string type, string logEvent, string details = "") {
LogEntry entry = MapToDB(new LogEntry() {
Type = type,
Event = logEvent,
Details = details
});
DB.Write(QueryAdd(entry));
SourceEntries.Add(entry);
if (Config.Current.GetForm("Log") != null)
((FormLog)Config.Current.GetForm("Log")).UpdateDataSource();
}
public void ReadAll() {
for (int i = SourceEntries.Count - 1; i >= 0; i--) {
SourceEntries.RemoveAt(i);
}
DataTable dt = DB.Read(QueryReadAll());
if (dt != null) {
foreach (DataRow row in dt.Rows) {
SourceEntries.Add(MapToList(row));
}
}
if (Config.Current.GetForm("Log") != null)
((FormLog)Config.Current.GetForm("Log")).UpdateDataSource();
}
public void RemoveAll() {
DB.Write(QueryRemoveAll());
for (int i = SourceEntries.Count - 1; i >= 0; i--) {
SourceEntries.RemoveAt(i);
}
Add("I", "Log cleared");
}
这工作但只有当我调用UpdateSource() 调用dgvLog.Update() 通过在另一个我想避免的单例类中使用自写的FormStack。当然,可以简单地在表单本身内调用dgvLog.Update(),但是,尤其是。通过这个日志示例,很明显,当显示 DataGridView 的表单仍在后台打开时,从另一个表单更新数据/在其中更新数据时,这无济于事。
另外,由于没有区别(在使用 DataTable 或 List 等与 BindingSource 之间)我想知道 BindingList 和 BindingSource 的好处/目的是什么:
这是正确的方法还是我错过了什么!?
顺便说一句,我使用的是 .NET v4.5.2。
【问题讨论】:
标签: c# winforms datagridview binding datasource