C#:DataGridView 数据源更新 - DataTable、List、BindingList 和 BindingSource?
C#: DataGridView DataSource Update - DataTable, List, BindingList and BindingSource?
我仍然对如何在不显式触发 DataGridView.Update()
的情况下更改 DataSource 的内容时自动更新 DataGridView 感到困惑。 DataTable
、List
、BindingList
作为(直接)DataSource 和作为(间接)DataSource 之间似乎没有任何区别,另外 BindingSource
使用任何以前作为数据源。
我实际为此使用的 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();
}
实体(单例class):
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()
时才有效 但 通过在另一个单例 class 中使用自己编写的 FormStack 来调用 dgvLog.Update()
喜欢回避。当然,可以简单地在表单本身内调用 dgvLog.Update()
但是,尤其是。对于这个日志示例,很明显这在更新数据时没有帮助 from/within 另一个表单,而显示 DataGridView 的表单仍在后台打开。
另外,由于没有区别(使用DataTable或List等和不使用BindingSource)我想知道BindingList和BindingSource的benefit/purpose是什么:
这是正确的方法还是我遗漏了什么!?
顺便说一下,我正在使用 .NET v4.5.2。
It seems there is no difference at all between DataTable, List, BindingList as (direct) DataSource and as (indirect) DataSource with an additional BindingSource which uses any of the former as DataSource.
BindingSource 有一些用途
- 保持 position/current 行的知识,因此可以实现共享导航(dgv 和文本框都绑定到同一个 BS 意味着 dgv 可以浏览记录和文本框更新,因为它们总是显示“当前行” )
- 提供排序和过滤设施
- 支持复杂的绑定场景,在这种情况下,它必须帮助将列表过滤到仅包含不同绑定源中某些当前选定父级的子级
- 为公共数据源的多个不同位置浏览提供分离
works but only when I call UpdateSource() which calls dgvLog.Update() by using a selfwritten FormStack in another singleton class which I would like to avoid. Of course, one could simply call dgvLog.Update() within the form itself but, esp. with this log example, it is obvious that this does not help when updating data from/within another form while the form that displays the DataGridView is still opened in the background.
Datagridview.Update() 与需要它的控件的重绘区域有关;它与提交对基础数据模型的更改无关。也许您需要 EndEdit 来完成对当前行的编辑操作并将它们提交到底层数据存储。当您单击网格中的不同行时也会发生这种情况。 Bindingsource 也有一个 EndEdit 方法。大多数情况下,您不需要自己调用这些方法
要在表单之间共享数据,请传递存储数据的数据表,并通过第二个表单中的绑定源绑定它
Also, as there is no difference (between using DataTable or List, etc. and BindingSource or not) I wonder what the benefit/purpose of BindingList and BindingSource are:
DataTable 是DataRow 的集合。 DataRow 的核心是一个对象数组。结束
绑定列表是任何你想要的列表,比如你自定义的class Person。可以说最终更有用,但它是在比较苹果和橙子。相反,如果您打开数据集设计器,那么您可以指定具有命名类型列的表。在这方面,它与编写您自己的 classes 并没有太大区别(尽管它可以在短时间内编写大量好的代码。我有时将它们用作数据模型
我仍然对如何在不显式触发 DataGridView.Update()
的情况下更改 DataSource 的内容时自动更新 DataGridView 感到困惑。 DataTable
、List
、BindingList
作为(直接)DataSource 和作为(间接)DataSource 之间似乎没有任何区别,另外 BindingSource
使用任何以前作为数据源。
我实际为此使用的 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();
}
实体(单例class):
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()
时才有效 但 通过在另一个单例 class 中使用自己编写的 FormStack 来调用 dgvLog.Update()
喜欢回避。当然,可以简单地在表单本身内调用 dgvLog.Update()
但是,尤其是。对于这个日志示例,很明显这在更新数据时没有帮助 from/within 另一个表单,而显示 DataGridView 的表单仍在后台打开。
另外,由于没有区别(使用DataTable或List等和不使用BindingSource)我想知道BindingList和BindingSource的benefit/purpose是什么:
这是正确的方法还是我遗漏了什么!?
顺便说一下,我正在使用 .NET v4.5.2。
It seems there is no difference at all between DataTable, List, BindingList as (direct) DataSource and as (indirect) DataSource with an additional BindingSource which uses any of the former as DataSource.
BindingSource 有一些用途
- 保持 position/current 行的知识,因此可以实现共享导航(dgv 和文本框都绑定到同一个 BS 意味着 dgv 可以浏览记录和文本框更新,因为它们总是显示“当前行” )
- 提供排序和过滤设施
- 支持复杂的绑定场景,在这种情况下,它必须帮助将列表过滤到仅包含不同绑定源中某些当前选定父级的子级
- 为公共数据源的多个不同位置浏览提供分离
works but only when I call UpdateSource() which calls dgvLog.Update() by using a selfwritten FormStack in another singleton class which I would like to avoid. Of course, one could simply call dgvLog.Update() within the form itself but, esp. with this log example, it is obvious that this does not help when updating data from/within another form while the form that displays the DataGridView is still opened in the background.
Datagridview.Update() 与需要它的控件的重绘区域有关;它与提交对基础数据模型的更改无关。也许您需要 EndEdit 来完成对当前行的编辑操作并将它们提交到底层数据存储。当您单击网格中的不同行时也会发生这种情况。 Bindingsource 也有一个 EndEdit 方法。大多数情况下,您不需要自己调用这些方法
要在表单之间共享数据,请传递存储数据的数据表,并通过第二个表单中的绑定源绑定它
Also, as there is no difference (between using DataTable or List, etc. and BindingSource or not) I wonder what the benefit/purpose of BindingList and BindingSource are:
DataTable 是DataRow 的集合。 DataRow 的核心是一个对象数组。结束
绑定列表是任何你想要的列表,比如你自定义的class Person。可以说最终更有用,但它是在比较苹果和橙子。相反,如果您打开数据集设计器,那么您可以指定具有命名类型列的表。在这方面,它与编写您自己的 classes 并没有太大区别(尽管它可以在短时间内编写大量好的代码。我有时将它们用作数据模型