我有一个绑定到BindingList(C#Windows窗体)的DataGridView.如果我更改列表中某个项目中的某个值,则不会立即显示在网格中.如果我点击更改的单元格,或最小化然后最大化它正确更新的窗口,但我需要它自动发生.
我之前遇到过同样的问题,但在那种情况下,我必须在值改变的同时更改单元格的背景颜色.这导致单元格正确刷新.
我能让它发挥作用的唯一方法是......
dataGridView.DataSource = null;
dataGridView.DataSource = myBindingList
Run Code Online (Sandbox Code Playgroud)
...但我真的想避免这种情况,因为它会使滚动条弹回到顶部,这意味着我必须再次设置我的单元格背景颜色.当然有更好的方法.我已经尝试了刷新(以及刷新父级),更新和无效,但他们没有做我需要的.
我已经在一些留言板上看到了这个问题,但还没有看到它的工作答案.
我需要在SQL Server中将Float转换为Decimal(28,10).我的问题是,由于浮动的性质和转换的方式,简单地转换浮动可能会使我的用户看起来错误的数字.
例如:
Float: 280712929.22
Cast as Decimal: 280712929.2200000300
What I think I want: 280712929.2200000000
Run Code Online (Sandbox Code Playgroud)
我对float的工作方式有点了解(这是一种近似的数据类型等),但不足以理解为什么它最后添加了300.它只是垃圾作为转换的副作用,还是以某种方式更精确地表示浮动实际存储的内容?对我来说,它似乎是凭空而来的精确度.
最终,我需要它是准确的,但也要看起来"正确".我想我需要得到那个底部数字,因为它看起来我刚刚添加了尾随零.这可能吗?这是一个好主意还是坏主意,为什么?其他建议是受欢迎的.
其他一些例子:
Float: 364322379.5731
Cast as Decimal: 364322379.5730999700
What I want: 364322379.5731000000
Float: 10482308902
Cast as Decimal: 10482308901.9999640000
What I want: 10482308902.0000000000
Run Code Online (Sandbox Code Playgroud)
附注:我将这些值放入的新数据库表是我的用户可读的.它们实际上现在只需要两个小数位,但是将来可能会改变,所以我们决定使用Decimal(28,10).长期目标是将我获取数据的浮点数转换为小数.
编辑:有时我的浮点数比我需要的小数位数多,例如:-0.628475064730907.在这种情况下,施法到-0.6284750647就好了.我基本上需要我的结果将零添加到浮点的末尾,直到我有10个小数位.
我有一个Rx Observable充当缓冲区.现在,当它获得10个项目时,或者在100毫秒之后,以先到者为准,它在订阅中执行该方法.
我注意到我的方法每100毫秒不断被调用,即使缓冲区中没有项目,这让我感到惊讶.如果它没有收到缓冲区中的任何项目,那么只需让我的方法立即返回就足够了,但我觉得奇怪的是它只是在背景中像这样生长.
为什么是这样?你怎么建议我最好处理这个?我是Rx的全新手,所以也许我正在做一些奇怪的事情.这是我的代码的简化版本:
private Subject<KeyValuePair<int, Action<MyData>>> serverRequests;
public MyBufferClass(IMyServer server, IScheduler scheduler)
{
this.serverRequests = new Subject<KeyValuePair<int, Action<MyData>>>();
this.serverRequests
.Buffer(TimeSpan.FromMilliseconds(100), 10, scheduler)
.Subscribe(buffer => GetMultipleItemsFromServer(buffer));
}
public void GetSingleItemFromServer(int id, Action<MyData> callback)
{
this.serverRequests.OnNext(new KeyValuePair<int, Action<MyData>>(id, callback));
}
public void GetMultipleItemsFromServer(IEnumerable<KeyValuePair<int, Action<MyData>>> idsWithCallbacks)
{
if (idsWithCallbacks.IsNullOrEmpty()) return;
this.server.GetMultipleItems(idsWithCallbacks)
}
Run Code Online (Sandbox Code Playgroud)
在我的测试中,如果我调用GetSingleItemFromServer 5次然后将我的TestScheduler推进1000毫秒,我认为GetMultipleItemsFromServer只会被调用一次,但它会被调用10次.
我有一个需要添加项目的工作线程BindingList.但是,BindingList数据绑定为a DataGridView.所以,当我尝试添加到列表中时,我得到了一个InvalidOperationException (Cross-thread operation not valid: Control accessed from a thread other than the thread it was created on.)
通常,对于此例外,您可以:
if(winformControl.InvokeRequired) {
winformControl.Invoke(MethodDelegate);
}
Run Code Online (Sandbox Code Playgroud)
然而,数据绑定会使事情变得混乱,因为看不到Winform控件.我只有以下行,它抛出异常:
ClassInstance.MyBindingList.Add(myObject);
Run Code Online (Sandbox Code Playgroud)
如果你有专门针对这种情况的解决方案,那很好.
如果没有,我怎样才能让工作线程告诉我的主线程执行一个特定的方法(工作线程提供了几个参数)?这可能是一个更好的选择,因为我的工作线程实际上正在做一堆东西(比如写入数据库),而且我不确定一切是否是线程安全的.我是一名学生,也是多线程的新手,而且这真的不是我的强项.
c# ×3
data-binding ×2
winforms ×2
.net ×1
bindinglist ×1
datagridview ×1
decimal ×1
sql-server ×1
t-sql ×1