我的应用程序有一个DataGridView对象和一个MousePos类型的List.MousePos是一个自定义类,它包含鼠标X,Y坐标("Point"类型)和此位置的运行计数.我有一个线程(System.Timers.Timer)每秒引发一次事件,检查鼠标位置,添加和/或更新此列表上鼠标位置的计数.
我想有一个类似的运行线程(再次,我认为System.Timers.Timer是一个不错的选择),这将再次引发一次事件一次自动Refresh()DataGridView,以便用户可以看到数据屏幕更新.(就像TaskManager一样.)
不幸的是,调用DataGridView.Refresh()方法会导致VS2005停止执行,并注意到我遇到了跨线程的情况.
如果我理解正确,我现在有3个主题:
为了看看我是否可以在主线程上刷新()DataGridView,我在表单中添加了一个名为DataGridView.Refresh()的按钮,但是这个(奇怪地)没有做任何事情.我发现了一个似乎表明如果我设置DataGridView.DataSource = null并返回到我的List的主题,它会刷新数据网格.确实这有效,但只能通过按钮(在主线程上处理).
所以这个问题变成了两个问题:
这是我到目前为止编写的代码(C#/.Net 2.0)
public partial class Form1 : Form
{
private static List<MousePos> mousePositionList = new List<MousePos>();
private static System.Timers.Timer mouseCheck = new System.Timers.Timer(1000);
private static System.Timers.Timer refreshWindow = new System.Timers.Timer(1000);
public Form1()
{
InitializeComponent();
mousePositionList.Add(new MousePos()); // ANSWER! Must have at least 1 entry before binding to DataSource
dataGridView1.DataSource = mousePositionList;
mouseCheck.Elapsed += new System.Timers.ElapsedEventHandler(mouseCheck_Elapsed);
mouseCheck.Start();
refreshWindow.Elapsed += new System.Timers.ElapsedEventHandler(refreshWindow_Elapsed);
refreshWindow.Start();
}
public void mouseCheck_Elapsed(object source, …Run Code Online (Sandbox Code Playgroud) 我一直在尝试为我的应用程序编写一个简单的静态类状态机,以便在系统状态发生变化时通知其他控件和代码.我想我几乎拥有它,但我遇到了一个小问题,我不知道如何解决.
这是代码:
// An enum denoting the 3 States
public enum Status { Error = -1, Working, Ready }
// The main state change class
public static class Sys
{
// system status
private static Status state;
// delegate and event
public static delegate void StateChangeHandler(object sys, SysInfoEventArgs sysStateInfo);
public static event StateChangeHandler OnStateChange;
public static Status State
{
get { return state; }
set
{
SysInfoEventArgs sysInfo = new SysInfoEventArgs(state, value);
state = value;
OnStateChange(this, sysInfo);
}
}
} …Run Code Online (Sandbox Code Playgroud) 假设有一个xml文件,如下所示:
<Instances>
<Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image1.jpg" ImageNumber = "1"/>
<Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image2.jpg" ImageNumber = "2"/>
<Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image3.jpg" ImageNumber = "3"/>
<Bits = "16" XCoord = "64" YCoord = "64" ZCoord = "64" FileType="jpeg" Location="C:\Series1\Image4.jpg" ImageNumber = "4"/>
<Bits = "16" XCoord = "64" YCoord = "64" ZCoord …Run Code Online (Sandbox Code Playgroud) 现在,我正在尝试解决一个IE6/7错误,该错误要求</a>使用此特定于IE的注释包含结束标记,以使某些下拉菜单工作:
<!--[if IE 7]><!--></a><!--<![endif]-->
Run Code Online (Sandbox Code Playgroud)
不幸的是,我无法将此直接注入到我的View页面代码中,如下所示:
<%= Html.ActionLink("LinkName<!--[if IE 7]><!--></a><!--<![endif]-->","Action","Controller") %>
Run Code Online (Sandbox Code Playgroud)
由于Html.ActionLink将做安全的事情并过滤掉注释以防止Javascript注入攻击.好的.我很好.好的设计决定.
我想要做的就是为此编写一个扩展方法,但是这个过程正在躲避我,因为我之前没有这样做过.
我认为这样可行,但是Intellisense似乎没有采用我编写的这种扩展方法.
public static class MyLinkExtensions
{
public static string ActionLinkIE(this HtmlHelper htmlHelper,
string linkText, string actionName, string controllerName)
{
return LinkExtensions.ActionLink(htmlHelper, linkText, actionName, controllerName).
Replace(@"</a>", @"<!--[if IE 7]><!--></a><!--<![endif]-->");
}
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?
编辑:班级名称是否重要?(就我而言,我称之为MyLinkExtensions)
此外,鼠标悬停在<%= Html.ActionLink() %>那里似乎已经是一个扩展方法.我可以扩展扩展方法吗?
对大多数人来说这似乎是显而易见的,但我只是想确认依赖注入(DI)依赖于接口的使用.
更具体地说,对于在其构造函数中具有某个接口作为参数的类或者定义为属性(也称为Setter)的某个接口的情况,DI框架可以移交具体类的实例以满足需要该类中的接口.(如果这个描述不清楚,请道歉.我无法正确描述这一点,因为术语/概念对我来说仍然有点新鲜.)
我问的原因是我目前有一个具有各种依赖性的类.不是对象依赖,而是URL.这个类看起来像这个[C#]:
using System.Web.Services.Protocols;
public partial class SomeLibraryService : SoapHttpClientProtocol
{
public SomeLibraryService()
{
this.Url = "http://MyDomainName.com:8080/library-service/jse";
}
}
Run Code Online (Sandbox Code Playgroud)
SoapHttpClientProtocol类有一个名为的Public属性Url(它是一个普通的旧"字符串"),这里的构造函数将其初始化为硬编码值.
我可以使用DI框架在构造中注入不同的值吗?我想的不是因为this.Url不是任何一种Interface; 这是一个String.
[顺便提一下,根据我正在使用的代码中的注释,上面的代码是"由wsdl自动生成的".所以我并不特别想改变这段代码,尽管我也没有看到自己重新生成它.所以可能更改此代码很好.]
我可以看到自己制作了一个替代构造函数,它将一个字符串作为参数并以this.Url这种方式初始化,但我不确定这是关于保持松散耦合的关注点分离的正确方法.(SoC)的
对这种情况有什么建议吗?
我想我们都同意C#3.0中的自动属性很棒.像这样的东西:
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
Run Code Online (Sandbox Code Playgroud)
减少到这个:
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
可爱!
但是,如果我想在"设置"时使用ToUpperInvariant()方法转换Name字符串,我应该怎么做.我是否需要恢复旧的C#2.0创建属性的风格?
private string name;
public string Name
{
get { return name; }
set { name = value.ToUpperInvariant(); }
}
Run Code Online (Sandbox Code Playgroud)
或者有更优雅的方式来实现这一目标吗?
我将大部分时间都花在C#上,并试图找出处理异常的最佳实践,并将调用方法中的错误消息干净地返回给调用方法.
例如,这是一些ActiveDirectory身份验证代码.请将此方法想象为类的一部分(而不仅仅是一个独立的函数.)
bool IsUserAuthenticated(string domain, string user, string pass, out errStr)
{
bool authentic = false;
try
{
// Instantiate Directory Entry object
DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, user, pass);
// Force connection over network to authenticate
object nativeObject = entry.NativeObject;
// No exception thrown? We must be good, then.
authentic = true;
}
catch (Exception e) { errStr = e.Message().ToString(); }
return authentic;
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是明确的YES或NO,您可以将其嵌入到If-Then-Else语句中.缺点是它还需要使用该方法的人提供字符串以获取错误(如果有的话).
我想我可以使用相同的参数减去"out errStr"来重载此方法,但忽略错误似乎是一个坏主意,因为这样的失败可能有很多原因......
或者,我可以编写一个返回错误字符串的方法(而不是使用"out errStr"),其中返回的空字符串表示用户认证正常.
string AuthenticateUser(string domain, string user, string …Run Code Online (Sandbox Code Playgroud) 最近我用一个Lambda表达式编写了一段C#代码:
var dynMenu = new List<MenuItem>();
// some code to add menu items to dynMenu
if (!dynMenu.Any(x => x.Text == controller))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
通过我的代码,我发现每个MenuItem本身都有一个名为ChildItems的属性,它恰好是MenuItemCollection类型.好奇,我想我会用这个MenuItemCollection替换我的MenuItem列表.
将第一行更改为:
var dynMenu = new MenuItemCollection();
Run Code Online (Sandbox Code Playgroud)
我注意到这个MenuItemCollection类型没有扩展方法,如"Any <>","All <>","First <>"等等 - 我觉得很奇怪.
有没有办法在这里使用Lambda表达式?
我应该回到使用"List <<\MenuItem>"吗?
c# ×5
.net ×1
actionlink ×1
asp.net-mvc ×1
c#-3.0 ×1
class ×1
datagridview ×1
delegates ×1
events ×1
exception ×1
lambda ×1
linq-to-xml ×1
menuitem ×1
return ×1
return-value ×1
setter ×1
static ×1
string ×1
xml ×1