我无法理解如何允许在运行时填充的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)
是否有一个简单的解决方案,允许用户通过单击列标题对这些值进行排序?
谢谢!
如果我通过设置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) 目标:
点击添加或删除按钮后,应使用文档中的最新数据刷新datagridview.
问题:
通过删除或添加新数据进行更改后,无法刷新datagridview.
我正在使用与datagridview的数据源链接的绑定源.
我用不同的解决方案尝试了一切,并从不同的论坛阅读建议,但我仍然无法解决这个问题.
我也尝试使用这些语法"BindingSource.ResetBindings(false)","BindingSource.Refresh()"等但没有结果.
以下链接:
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) 我有一个由本文所述的DataGridView支持.SortableBindingList
这本质上是一个BindingList数据源是自定义对象列表.底层自定义对象以编程方式更新.
我SortableBindingList允许我按升序或降序对每列进行排序.我通过重载ApplySortCore方法 完成了这个
protected override void ApplySortCore(PropertyDescriptor prop,
ListSortDirection direction)
Run Code Online (Sandbox Code Playgroud)
这适用于单击列标题时的排序,但在以编程方式更新该列中的单元格时不会自动排序.
有没有其他人想出一个很好的解决方案来保持DataGridView从其基础数据源的程序化更新排序?
设置一个[...].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#中数据绑定的一些基本原理.我可以在这里找到正确方向的帮助吗?谢谢!
是什么让我使用这样的东西:
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) 当我尝试删除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成功删除最后一个项目后才会抛出异常.它被外部代码抛出,所以我无法准确地告诉它究竟是什么抛出它.
所以,我在这里,请求一些帮助:).
提前谢谢,贾斯汀
使用绑定到绑定到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) 我有一个工作订单的捕获表单,它有一个CustomerBindingSource和一个WorksOrderBindingSource控件.大多数编辑字段都绑定到WorksOrderBindingSource,其中一个ComboBox的列表绑定到CustomerBindingSource,并且它SelectedValue绑定到的CustomerId字段WorksOrderBindingSource.这都是非常常规和标准的,这里没有任何好玩的东西.
然后,我还有一些文本框字段,我用它来显示当前所选客户的属性,用于当前编辑的工单.我也将这些领域捆绑在一起CustomerBindingSource.选择客户后,这些字段会按预期显示该客户的属性.
我的问题是当我想使用表单捕获新的工作订单时.我实例化一个新WorksOrder对象,CustomerId == null并将其绑定到WorksOrderBindingSource.我在没有对象CustomerBindingSource有Id == null,因此,如预期,下拉组合框为空,但是,该CustomerBindingSource.Current属性指向该数据源的第一个客户对象.客户链接的显示字段显示该客户的值,而尚未选择任何客户.
对我而言,唯一可行的解决办法似乎很笨拙.在其中,我有两个客户类型的绑定源,一个用于选定的客户,并填充客户显示字段,另一个仅用于填充客户下拉列表.然后,我必须处理选择事件,并且仅当选择了客户时,才在显示字段的绑定源中找到该客户,如果没有选择,则将显示字段的数据源设置为null.这感觉非常笨拙.有没有其他方法可以实现我想要的?
我们绑定一个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它不能成为自己的数据源一样.不要将DataSource和DataMember属性设置为引用的值BindingSource. …
datagridview backgroundworker thread-safety bindingsource winforms
bindingsource ×10
datagridview ×6
winforms ×6
c# ×5
data-binding ×5
.net ×2
bindinglist ×1
c#-4.0 ×1
datasource ×1
linq ×1
linq-to-sql ×1
vb.net ×1