Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将WinForm与DatagridView同步_C#_Datagridview_Sql Server Ce - Fatal编程技术网

C# 将WinForm与DatagridView同步

C# 将WinForm与DatagridView同步,c#,datagridview,sql-server-ce,C#,Datagridview,Sql Server Ce,我有一个带有DataGridView的表单,它的数据源是表的BindingSource。此视图将有一个单行选择和一个按钮,用于在弹出窗体中删除、编辑当前选定的行,以及一个插入按钮,该按钮也将使用相同的窗体 我的问题是如何将pop表单与当前行同步 我试图使用RowStateChanged事件获取并存储要在表单中使用的当前选定行,但我无法。事件发生后,我得到之前选择的行 在C语言中,我还不明白的另一件事是,如何拥有一个记录集,并知道哪个是当前记录,即使它是一个新的记录,以某种方式插入,一旦进入表单,

我有一个带有DataGridView的表单,它的数据源是表的BindingSource。此视图将有一个单行选择和一个按钮,用于在弹出窗体中删除、编辑当前选定的行,以及一个插入按钮,该按钮也将使用相同的窗体

我的问题是如何将pop表单与当前行同步

我试图使用RowStateChanged事件获取并存储要在表单中使用的当前选定行,但我无法。事件发生后,我得到之前选择的行


在C语言中,我还不明白的另一件事是,如何拥有一个记录集,并知道哪个是当前记录,即使它是一个新的记录,以某种方式插入,一旦进入表单,所有输入的数据都将同时显示在DataGridView中。

您可以轻松地保持同步,但不必使用BindingSource

Windows窗体数据绑定构建在几个界面之上,最重要的是: IList和IBindingList。第一个只是负责通过列表中元素的索引提供对元素的访问(为了简单起见),第二个实际上更复杂

IBindingList-(由BindingSource实现)具有可支持的方法:

  • 变更通知
  • 添加新的“空”元素
  • 分类
  • 搜寻
当然,对您来说最重要的是变更通知。不幸的是,BindingSource没有实现这段代码。您可以在这里做两件事-要么使用更改通知实现您的BindingSource版本,要么尝试使用DGV和TextBox/ComboBox事件来更新数据

就我个人而言,我已经做了第一个(我可以分享我的代码)

“在C#中,我还不明白的另一件事是,如何拥有一个记录集,并知道哪个是当前记录,即使它是一个新的记录,以某种方式插入,一旦进入表单,所有输入的数据将同时显示在DataGridView中。”


每个表单都有一个BindingContext对象,用于保存CurrencyManager—每个数据源一个。这样,绑定到同一数据源的每个控件都知道哪个记录是当前记录。实际上,BindingNavigator所做的是干扰适当的CurrencyManager并调用其方法。(我不知道为什么它需要BindingSource,而不是在最小的IList中,或者需要完整的功能IBindingList)

您不必将表单与当前行同步。这就是
BindingSource
的用途

当您对
BindingSource
执行简单绑定时,每次其当前项更改时,绑定控件都会更新,每次绑定控件中的值更改时,绑定项中的基础值都会更新。执行复杂绑定时(即绑定控件显示
BindingSource
的列表,而不仅仅是当前项),更改
BindingSource
上的
位置也将更改绑定控件中的当前位置,反之亦然。因此,在本例中,您希望使用简单绑定绑定第二个表单上的控件,并使用复杂绑定绑定第一个表单上的
DataGridView

您需要做的唯一不寻常的事情是确保两个表单使用相同的
BindingSource
。执行此操作时,单击
DataGridView
中的新行更新
BindingSource
上的
位置,并且
BindingSource
将当前绑定项中的值推送到绑定到它的所有简单绑定控件

这是很容易做到的。假设
Form1
是带有
DataGridView
的表单,而
Form2
是带有简单绑定控件的表单,请执行以下操作:

在表格1中:

private BindingSource Source = new BindingSource();

Form1_Load(object sender, EventArgs e)
{
    // set Source's DataSource to your DataTable here.
    mainDataGridView.DataSource = source;
    // create DataGridView columns and their bindings here.

    Form2 f2 = new Form2();
    f2.TopMost = true;
    f2.Source = Source;
    f2.Show();
}
表格2:

public BindingSource Source { get; set; }

public void Form2_Load(object sender, EventArgs e)
{       
    idTextBox.DataBindings.Add("Text", Source, "id");
    descriptionTextBox.DataBindings.Add("Text", Source, "description")
}

我想知道答案,但我想我几乎什么都不懂。我是C#新手,主要使用Java,我记得在过去使用VB记录集,在那里我可以简单地来回处理数据。现在看起来C#使用了一个断开的记录集,在DataGridView中所做的更改需要“手动”更新到db中。我正在寻找一个简单的方法来实现这一点,最好只使用RAD接口,但看起来我需要了解更多,我看不到任何关于它的好的来源来指向最佳实践。我将尝试做我的家庭作业,但仍在寻找一个简单的解决方案。在某些情况下,您可能希望进入
IBindingList
BindingContext
CurrencyManager
的世界,但将控件与
DataTable
保持同步不是其中之一。您明白了,非常感谢你。我做了这件事,效果很好。我只是还不知道如何提交我的更改,而且,在我做的测试中,新添加的行在被释放后只显示表单中的一些值,但当选择另一行时,这些值就在那里。在大多数情况下,只要
Position
更改,即当用户移动到另一行时,就会提交更改。通过在
BindingSource
上调用
EndEdit
,可以显式地将挂起的更改提交到当前行。(您可以通过调用
CancelEdit
)回滚它们,直到添加新行为止:添加新行时,新行中的每一列都会填充其
DataColumn
中定义的任何
DefaultValue
。然后它被添加到列表中,任何复杂的绑定控件都会被告知新行存在,并显示新行。