Winform中,DataBindings的OnPropertyChanged參數不起作用

hanjoe109 2009-09-21 11:59:51
自定義的實體類,可讀寫。
用BindingList類型綁定到BindingSource,然後再綁定表格、文本框。
目的:編輯文本筐時,數據馬上反映到表格。
同樣的寫法,其他5個界面都可以,卻偏偏有一個界面就是不行。

代碼就挑重要的幾行出來


//獲取數據
IList<Model.Tdpur004Info> Lists = tdpur004mgr.GetModelByID(str_rono);

//不能直接绑定IList到BS,需转化成BindingList
BindingList<Model.Tdpur004Info> blist = new BindingList<Model.Tdpur004Info>(Lists);

//綁定BindingSource
BS.DataSource = blist;

//綁定表格
dgv.DataSource = BS;


//綁定文本筐
txtQTY.DataBindings.Add("Text", BS, "QTY", true, DataSourceUpdateMode.OnPropertyChanged, null, "N4");



別的窗體可以,同樣的寫法它卻不可以,所以我不知道該如何找問題。

謝謝啦!
...全文
434 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanjoe109 2009-09-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 hanjoe109 的回复:]
我把原來沒問題的5個界面當中的一個的Model的Equals方法,固定返回false值,也出現同樣的問題:即編輯文本框,不會馬上刷新表格。
[/Quote]

原先我給表格新增行是這樣的:BS.AddNew();//那麼kono值默認是false

因為

Model的Equals方法,固定返回false值,也出現同樣的問題

因此,我手動給kono賦值為true


Model.Tdpur004Info Info = new Model.Tdpur004Info();
Info.kono = true;

BS.Add(Info);


暫時就先就這樣解決吧
hanjoe109 2009-09-22
  • 打赏
  • 举报
回复
晕死,终于找到答案了,可不明白呀

在实体类里我重写了Equals方法


/// <summary>判断是否同供应商、公司、订单类型、物料
/// 在IList.Contains中需使用到
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
return false;

Tdpur004Info Info = (Tdpur004Info)obj;

//如果不类型控制,不同
//if (!Info.kono) return false;//旧代码。

if (_kono = Info.kono
&& !_kono) return false;//新代码。很奇怪,旧代码不加否定也没问题


//实行类型控制,则看供应商等资料
if (_suno == Info.suno
&& _ncmp == Info.ncmp
&& _ckcd == Info.ckcd
&& _itno == Info.itno)
return true;

return false;

}

ncjcz 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 hanjoe109 的回复:]
引用 18 楼 ncjcz 的回复:
不明白你这个Equals方法干什么用的。
比较一个实体是否和另一个实体的类型、值一样?

并且被比较的实体的kono值为false就认为他们不同?


是的
[/Quote]

为什么不是if(!_kono||!Info.kono) return false;
应该2者任一个kono为false都不能合并的啊
hanjoe109 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ncjcz 的回复:]
不明白你这个Equals方法干什么用的。
比较一个实体是否和另一个实体的类型、值一样?

并且被比较的实体的kono值为false就认为他们不同?
[/Quote]

是的
hanjoe109 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ncjcz 的回复:]
不明白你这个Equals方法干什么用的。
比较一个实体是否和另一个实体的类型、值一样?

并且被比较的实体的kono值为false就认为他们不同?
[/Quote]

以前查資料,自定義的Model,如果需要用IList.Contains來判斷集合是否包含某個Model,需要重寫Equals方法。然後我就加了Equals方法。

業務邏輯是這樣的,採購申請單轉採購單的時候,需要根據條件合並申請數量。
條件是:1、如果kono[是否類型控制]不同,即認為兩張申請單不同,不能合並數量;//return false
2、再看供應商、公司、訂單類型、物料,如果相同則可以合並數量;//return true;
3、前兩個條件都不滿足,則不能合並數量;//return false;

上面就是Equals方法的邏輯
ncjcz 2009-09-22
  • 打赏
  • 举报
回复
不明白你这个Equals方法干什么用的。
比较一个实体是否和另一个实体的类型、值一样?

并且被比较的实体的kono值为false就认为他们不同?
hanjoe109 2009-09-22
  • 打赏
  • 举报
回复
我把原來沒問題的5個界面當中的一個的Model的Equals方法,固定返回false值,也出現同樣的問題:即編輯文本框,不會馬上刷新表格。

hanjoe109 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 ncjcz 的回复:]
if (!Info.kono) return false
根据你的逻辑应该是这样写的

你用日志记录下Info.kono的值吧,估计你传进来的obj有问题
[/Quote]

if (!Info.kono) return false;
我昨晚試過了,不行。

剛才在Equals方法內設斷點,kono一直是false
根據if (!Info.kono) return false;那Equals方法的返回值就是false.

ncjcz 2009-09-22
  • 打赏
  • 举报
回复
if (!Info.kono) return false
根据你的逻辑应该是这样写的

你用日志记录下Info.kono的值吧,估计你传进来的obj有问题
ncjcz 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hanjoe109 的回复:]
引用 9 楼 ncjcz 的回复:
很简单
if (_kono = Info.kono
                && !_kono) return false;
注意第一行,你用了一个赋值=而不是判定==


剛開始看到你的回復的時候,我還以為是我發帖的時候copy錯了,真那樣寫,編譯應該通不過呀。
但源代碼確實是 = 而不是 = =,改為= =後又有問題了。

得再查查。
[/Quote]
编译是可以通过的,看下面代码
bool a =false ;
if (a = false && !a)
MessageBox.Show("aa");
-----------
a = false 那就是false
!a为true
如果是a=true那前面一半得到的就是true
hanjoe109 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ncjcz 的回复:]
很简单
if (_kono = Info.kono
&& !_kono) return false;
注意第一行,你用了一个赋值=而不是判定==
[/Quote]

剛開始看到你的回復的時候,我還以為是我發帖的時候copy錯了,真那樣寫,編譯應該通不過呀。
但源代碼確實是 = 而不是 = =,改為= =後又有問題了。

得再查查。

ncjcz 2009-09-22
  • 打赏
  • 举报
回复
你原来的代码if (!Info.kono) return false
要求Info.kono是false才返回false
两次的逻辑完全不同啊
ncjcz 2009-09-22
  • 打赏
  • 举报
回复
if (_kono = Info.kono && !_kono) return false;
你这句判断其实不是单纯的判断Info.kono
而是判断的必须_kono为FALSE且Info.kono为TRUE,才会返回FALSE
Andy__Huang 2009-09-22
  • 打赏
  • 举报
回复
同样的写法,其他地方可以,我认为这个页面应该是引用不对
ncjcz 2009-09-22
  • 打赏
  • 举报
回复
很简单
if (_kono = Info.kono
&& !_kono) return false;
注意第一行,你用了一个赋值=而不是判定==
hanjoe109 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 ncjcz 的回复:]
引用 20 楼 hanjoe109 的回复:
引用 18 楼 ncjcz 的回复:
不明白你这个Equals方法干什么用的。
比较一个实体是否和另一个实体的类型、值一样?

并且被比较的实体的kono值为false就认为他们不同?


是的


为什么不是if(!_kono||!Info.kono) return false;
应该2者任一个kono为false都不能合并的啊
[/Quote]

好,謝謝,晚上我再試一下,下午要去用戶那。

但是,象我在17樓說的,Equals返回的是false值都不能刷新表格。這怎麼解釋呢?

[Quote=引用 17 楼 hanjoe109 的回复:]
我把原來沒問題的5個界面當中的一個的Model的Equals方法,固定返回false值,也出現同樣的問題:即編輯文本框,不會馬上刷新表格。


[/Quote]
足球中国 2009-09-21
  • 打赏
  • 举报
回复
是不是绑定的不对。
其他窗口可以,证明没问题的。
有可能是你在设置这个窗体时,设置的字段错了。
hanjoe109 2009-09-21
  • 打赏
  • 举报
回复
說明:我說的不起作用是指編輯文本框時表格沒有馬上刷新過來,需要光標移到其他行才可以,有時候移到別的單元格也可以
ncjcz 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hanjoe109 的回复:]
引用 4 楼 lzsh0622 的回复:
C# codetxtQTY.DataBindings.Add("Text", bds,"QTY",true, DataSourceUpdateMode.OnPropertyChanged);


這種方法試過了,不行

我還把沒問題的窗口的表格、BindingSource拷過來,都不行
實體類的代碼也對過一遍,還是沒找出來問題點來
[/Quote]
重新建一个FORM试试
hanjoe109 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lzsh0622 的回复:]
C# codetxtQTY.DataBindings.Add("Text", bds,"QTY",true, DataSourceUpdateMode.OnPropertyChanged);
[/Quote]

這種方法試過了,不行

我還把沒問題的窗口的表格、BindingSource拷過來,都不行
實體類的代碼也對過一遍,還是沒找出來問題點來
加载更多回复(3)

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧