标签: bindingsource

允许用户从DataGridView中的LINQ查询中对列进行排序

我无法理解如何允许在运行时填充的DataGridView通过BindingSource排序(当用户单击列标题时)来自XML查询的LINQ是DataSource.

    Dim QueryReOrder = From Q In Query _
                       Where ((0 - Q.Qualifier) / cmbTSStakeValue.Text) <= 0.1 _
                       Order By Q.Qualifier Descending _
                       Select Q

    Dim bs As New BindingSource
    bs.DataSource = QueryReOrder
    DGFindMatch.DataSource = bs
Run Code Online (Sandbox Code Playgroud)

一些DataGridView的属性是:

Sort            Nothing String
SortProperty                Nothing System.ComponentModel.PropertyDescriptor
SupportsAdvancedSorting         False   Boolean
SupportsChangeNotification      True    Boolean
SupportsFiltering           False   Boolean
SupportsSearching           False   Boolean
SupportsSorting             False   Boolean
Run Code Online (Sandbox Code Playgroud)

是否有一个简单的解决方案,允许用户通过单击列标题对这些值进行排序?

谢谢!

.net linq data-binding datagridview bindingsource

8
推荐指数
2
解决办法
1万
查看次数

使用WriteValue进行手动数据绑定

如果我通过设置DataSourceUpdateMode = Never来关闭绑定数据源的自动更新然后使用按钮来更新整个批次(使用binding.WriteValue),则会出现问题 - 即,仅更新第一个绑定控件的数据源.所有其他控件将重置为原始值.

这是因为当当前对象发生更改时(如上面的WriteValue之后),如果ControlUpdateMode = OnPropertyChange,则所有其他控件都会重新读取数据源中的值.

避免这个问题的标准方法是什么?

一种方法是从BindingSource派生一个类并添加一个WriteAllValues方法.此方法执行以下操作:

(1)对于每个Binding,保存ControlUpdateMode

(2)对于每个Binding,设置ControlUpdateMode = Never

(3)对于每个Binding,调用WriteValue方法

(4)对于每个Binding,将ControlUpdateMode重置为保存的值

(5)对于每个Binding,如果ControlUpdateMode = OnPropertyChange,则调用ReadValue方法.

你能看到这样做有什么问题吗?

如果使用自己的类,实现IEditableObject会解决问题吗?

在我正在研究的另一个控件中,我实现了自己的绑定.我解决这个问题的方法是使用以下代码.(我已经把它放在最低限度,我希望你能遵循它!):

Private Shared ControlDoingExplicitUpdate As MyCustomControl = Nothing

Private Sub UpdateDataSourceFromControl(ByVal item As Object, ByVal propertyName As String, ByVal value As Object)
  Dim p As PropertyDescriptor = Me.props(propertyName)
  Try
    ControlDoingExplicitUpdate = Me
    p.SetValue(item, value)
  Catch ex As Exception
    Throw
  Finally
    ControlDoingExplicitUpdate = Nothing
  End Try
End Sub

Private Sub DataBindingSource_CurrentItemChanged(ByVal sender As Object, ByVal e As System.EventArgs)
  If (ControlDoingExplicitUpdate …
Run Code Online (Sandbox Code Playgroud)

.net vb.net data-binding bindingsource winforms

8
推荐指数
1
解决办法
3857
查看次数

无法使用bindingsource刷新datagridview

目标:
点击添加或删除按钮后,应使用文档中的最新数据刷新datagridview.

问题:

通过删除或添加新数据进行更改后,无法刷新datagridview.

我正在使用与datagridview的数据源链接的绑定源.

我用不同的解决方案尝试了一切,并从不同的论坛阅读建议,但我仍然无法解决这个问题.

我也尝试使用这些语法"BindingSource.ResetBindings(false)","BindingSource.Refresh()"等但没有结果.

以下链接:

如何刷新bindingsource

http://www.eggheadcafe.com/community/aspnet/2/10114324/datagridview-refresh-from-another-form.aspx

http://blogs.msdn.com/b/dchandnani/archive/2005/03/15/396387.aspx

http://bytes.com/topic/c-sharp/answers/812061-problem-refresh-datagridview

    bSrcStock.DataSource = myProductrepository.GetAllProductList();


    dgridStock.DataSource = null;
    dgridStock.DataSource = bSrcStock;
    bSrcStock.ResetBindings(true);


    dgridStock.Columns[0].Width = 101;
    dgridStock.Columns[1].Width = 65;
    dgridStock.Columns[2].Width = 80;
    dgridStock.Columns[3].Width = 120;
    dgridStock.Columns[4].Width = 90;
Run Code Online (Sandbox Code Playgroud)

c# datagridview bindingsource

8
推荐指数
1
解决办法
1万
查看次数

保持DataGridView自动排序

我有一个由本文所述的DataGridView支持.SortableBindingList

这本质上是一个BindingList数据源是自定义对象列表.底层自定义对象以编程方式更新.

SortableBindingList允许我按升序或降序对每列进行排序.我通过重载ApplySortCore方法 完成了这个

protected override void ApplySortCore(PropertyDescriptor prop,
                                      ListSortDirection direction)
Run Code Online (Sandbox Code Playgroud)

这适用于单击列标题时的排序,但在以编程方式更新该列中的单元格时不会自动排序.

有没有其他人想出一个很好的解决方案来保持DataGridView从其基础数据源的程序化更新排序?

c# datagridview bindingsource

8
推荐指数
1
解决办法
296
查看次数

设置对象的DataSource属性时,何时使用Type与实例?

设置一个[...].DataSource对象的实例与一个类的类型有什么区别?我已经看到在我们的代码库中使用了这两种方法,并且我试图在这些情况下解决为什么它是这种或那种方式.

如何

object1.DataSource = typeof(SomeClass);
Run Code Online (Sandbox Code Playgroud)

与......不同

object2.DataSource = getSomeObject();
Run Code Online (Sandbox Code Playgroud)

进一步询问

另外,在第一种情况下,如果我将a设置DataSource为类的类型,那么如果该类是基类会发生什么?数据绑定是否适用于仅存在于从基类继承的类中的属性?或者数据绑定仅适用于我设置的类类型的类成员DataSource

我很难写出我的Google搜索查询,以便回答这个问题.这要么是因为这些东西很复杂,我只是没有正确的措辞,或者我不太了解C#中数据绑定的一些基本原理.我可以在这里找到正确方向的帮助吗?谢谢!

c# data-binding datasource bindingsource winforms

8
推荐指数
1
解决办法
1383
查看次数

BindingSource - 使用BindingSource有什么好处

是什么让我使用这样的东西:

DataGridView dgvDocuments = new DataGridView();
BindingSource bindingSource = new BindingSource();
DataTable dtDocuments;

dtDocuments = MsSQL.GetDocuments(dtpOd.Value, dtpDo.Value);
bindingSource.DataSource = dtDocuments;
dgvDocuments.DataSource = bindingSource;
Run Code Online (Sandbox Code Playgroud)

而不是这个:

DataGridView dgvDocuments = new DataGridView();
DataTable dtDocuments;

dtDocuments = MsSQL.GetDocuments(dtpOd.Value, dtpDo.Value);
dgvDocuments.DataSource = dtDocuments;
Run Code Online (Sandbox Code Playgroud)

c# datagridview bindingsource

8
推荐指数
2
解决办法
5535
查看次数

删除列表中的最后一项时,数据绑定上的InvalidOperationException

当我尝试删除datagridview中的最后一项时,我收到以下消息.

DataBinding在列表中找不到适合所有绑定的行.

我的绑定设置如下.

ExtendedBindingList<MyClass> bl = new ExtendedBindingList<MyClass>(GetDataFromDB());
BindingSource bs = new BindingSource();
bs.DataSource = bl;
dgv.DataSource = bs;
Run Code Online (Sandbox Code Playgroud)

ExtendedBindingList只是简单的东西,我把它们放在一起实现排序和过滤以及一些基本的状态持久性.dgv是DataGridView.GetDataFromDB返回MyClass的List.

只有在我尝试使用以下方法从datagridview中删除最后一项时才会出现此问题:

bs.RemoveCurrent();
Run Code Online (Sandbox Code Playgroud)

其他所有时间都有效.我唯一提示解决方案是删除所有绑定并重新应用它们,但这似乎不是一个理想的解决方案.

编辑 只有在BindingList成功删除最后一个项目后才会抛出异常.它被外部代码抛出,所以我无法准确地告诉它究竟是什么抛出它.

所以,我在这里,请求一些帮助:).

提前谢谢,贾斯汀

c# data-binding bindinglist bindingsource winforms

6
推荐指数
1
解决办法
2616
查看次数

如何通过代码将BindingSource移动到特定记录

使用绑定到绑定到LINQ to SQL类的BindingSource控件的datagridview ,我想知道如何将bindingSource定位到特定记录,也就是说,当我在文本框中键入产品名称时,bindingsource应该移动到该特定产品.这是我的代码:

以我的形式FrmFind:

    NorthwindDataContext dc;
    private void FrmFind_Load(object sender, EventArgs e)
    {
        dc = new NorthwindDataContext();

        var qry = (from p in dc.Products
                   select p).ToList();

        FindAbleBindingList<Product> list = new FindAbleBindingList<Product>(qry);

        productBindingSource.DataSource = list.OrderBy(o => o.ProductName);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        TextBox tb = sender as TextBox;

        int index = productBindingSource.Find("ProductName", tb.Text);

        if (index >= 0)
        {
            productBindingSource.Position = index;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在程序类中:

    public class FindAbleBindingList<T> : BindingList<T>
    {

        public FindAbleBindingList()
            : base()
        { …
Run Code Online (Sandbox Code Playgroud)

datagridview bindingsource linq-to-sql winforms c#-4.0

6
推荐指数
1
解决办法
2万
查看次数

如何将BindingSource当前记录设置为null?

我有一个工作订单的捕获表单,它有一个CustomerBindingSource和一个WorksOrderBindingSource控件.大多数编辑字段都绑定到WorksOrderBindingSource,其中一个ComboBox的列表绑定到CustomerBindingSource,并且它SelectedValue绑定到的CustomerId字段WorksOrderBindingSource.这都是非常常规和标准的,这里没有任何好玩的东西.

然后,我还有一些文本框字段,我用它来显示当前所选客户的属性,用于当前编辑的工单.我也将这些领域捆绑在一起CustomerBindingSource.选择客户后,这些字段会按预期显示该客户的属性.

我的问题是当我想使用表单捕获新的工作订单时.我实例化一个新WorksOrder对象,CustomerId == null并将其绑定到WorksOrderBindingSource.我在没有对象CustomerBindingSourceId == null,因此,如预期,下拉组合框为空,但是,该CustomerBindingSource.Current属性指向该数据源的第一个客户对象.客户链接的显示字段显示该客户的值,而尚未选择任何客户.

对我而言,唯一可行的解​​决办法似乎很笨拙.在其中,我有两个客户类型的绑定源,一个用于选定的客户,并填充客户显示字段,另一个仅用于填充客户下拉列表.然后,我必须处理选择事件,并且仅当选择了客户时,才在显示字段的绑定源中找到该客户,如果没有选择,则将显示字段的数据源设置为null.这感觉非常笨拙.有没有其他方法可以实现我想要的?

data-binding bindingsource winforms

6
推荐指数
1
解决办法
4238
查看次数

"BindingSource不能是它自己的数据源" - 尝试从另一个类中的方法重置绑定源时出错

我们绑定一个DataGridview使用BindingSource.所以在我们这样给出的主线程中.

            class1BindingSource = new BindingSource();
            class1BindingSource.DataSource = class1List;  
            this.dataGridView1.DataSource = class1BindingSource;
Run Code Online (Sandbox Code Playgroud)

之后,我在窗体中放置了一个后台工作器,并在单击按钮时触发.

即在按钮单击中

this.backgroundWorker1.RunWorkerAsync()
Run Code Online (Sandbox Code Playgroud)

BackgroundWorker DoWork Event我试图BindingSource通过尝试更新来更新和那里DataGridview.

因此,BindingSource重置是在另一个类的方法中完成的.

DoWork Event

Class2 cl2 = new Class2();
cl2.UpdateBindingSource(class1BindingSource);
Run Code Online (Sandbox Code Playgroud)

UpdateBindingSource Method

public void UpdateBindingSource(BindingSource bs)
        {
            Class1 c1 = bs.Current as Class1;    
            for (int i = 0; i < 1000; i++)
            {
                lock (bs.SyncRoot)
                {
                    c1.MyProperty1 = i;
                    bs.ResetItem(0);
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

现在我得到一个例外,就像BindingSource它不能成为自己的数据源一样.不要将DataSourceDataMember属性设置为引用的值BindingSource. …

datagridview backgroundworker thread-safety bindingsource winforms

6
推荐指数
1
解决办法
1万
查看次数