我试图实现双向一个DataGridView和为DGV提供数据的BindingList之间的结合。 某些列尚未反映在基础列表的变化,我想这是因为我还没有提供的属性设置(S),通知的属性更改。 而不是代码的行属性的setter以同样的方式我做的过程财产,我想获得更多的“优雅”,我意识到我坚持....
我偶然发现了一个非常有趣的书面记录了一个更好的方法,我想实现它的概念(请参阅): http://www.gavaghan.org/blog/2007/07/17/use-inotifypropertychanged-与-的BindingList /
下面是Mike的文章中,我想用(在我CBMI.Common项目确立为Utilities.cs)的代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace CBMI.Common
{
public static class Utilities
{
public static bool Set<T>(object owner, string propName,
ref T oldValue, T newValue, PropertyChangedEventHandler eventHandler)
{
// make sure the property name really exists
if (owner.GetType().GetProperty(propName) == null)
{
throw new ArgumentException("No property named '" + propName + "' on " + owner.GetType().FullName);
}
if (!Equals(oldValue, newValue)) // we only raise an event if the value has changed
{
oldValue = newValue;
if (eventHandler != null)
{
eventHandler(owner, new PropertyChangedEventArgs(propName));
}
}
return true; // Please NOTE: I had to add this statement to avoid compile error:
// "not all code paths return a value".
}
}
}
所以,我对第一个问题 :笔者并没有在他的文章return语句和我说这其中解决了编译器错误。 我猜的事件处理程序执行和回报,这是一个作家遗漏,并作为该方法想要一个布尔返回类型,应返回真。 那是正确的假设?
我的第二个问题说明了什么是C#菜鸟我,当我尝试使用上面这个辅助方法。 我已经编写这个类到名为在同一个项目InputFileInfo.cs(和命名空间)作为上述一个单独的文件:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
namespace CBMI.Common
{
public class InputFileInfo : INotifyPropertyChanged
{
private bool processThisFile;
public bool Process
{
get { return processThisFile; }
set
{
processThisFile = value;
this.NotifyPropertyChanged("Process");
}
}
public string FileName { get; set; }
private long rowsReturned;
public long Rows
{
get { return rowsReturned; }
set
{
Utilities.Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
}
}
public string Message { get; set; }
// constructor
public InputFileInfo(string fName)
{
Process = true;
FileName = fName;
Rows = 0;
Message = String.Empty;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
}
}
在这一类中的第2个属性的setter是我尝试使用麦克的静态方法:
Utilities.Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
如果我删除Utilities.Set和如下的代码只是它:
Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
..then我得到的编译器抱怨“名‘设置’在目前情况下不存在”。
我尝试添加一个使用工具; 指令 ,但没有解决问题。
最后,我不明白的参数:裁判牛逼的属性oldValue,T NEWVALUE
也不是参数调用值,其中所述Set方法被调用。
有人可以帮我在这段代码,这些多混乱,所以我可以使用这些更高级的想法?
----编辑UPDATE ----两个很好的答案,帮助我得到这个工作。 上述在原岗位的“第二个问题”仍然是一个有点难以捉摸。 增加了对每个请求对如何打包这个,所以我可以用简单的调用语法在迈克的原创文章“最佳实践”的意见。 也就是说,我正在寻找援引“帮手”仅方法名称的静态方法。 我想了解如何调用,如:
set
{
Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
}
而不必编写为:
set
{
Utilities.Set(this, "Rows", ref rowsReturned, value, PropertyChanged);
}
我通过编码Utilities.Set得到了这个工作,但我想这个问题摇身一变比特到- “?与类名它们‘’我在哪里可以把静态方法和如何给他们打电话,所以我没有”资格 我想了解如何包装通常是有用的“效用”型方法不需要对象的实例。 在这种情况下,静态方法被调用设置,但我希望能够添加其他静态方法,例如:
public static int HelpfulMethodXXXX(string s, int num)
我有一个单独编译的DLL只包含类文件(S)(Vstudio项目)。 最后,我想认为我可以在其他应用程序中使用这个类。
哪里是声明这些类的静态方法,使得它们可以被调用为最佳地点:
int i = HelpfulMethodXXXX("Sample", testNumber);
代替:
int i = ContainingClassName.HelpfulMethodXXXX("Sample", testNumber);