C#的"非信徒"问我扩展方法的目的是什么.我解释说,然后您可以向已定义的对象添加新方法,尤其是当您不拥有/控制原始对象的源时.
他提出"为什么不在自己的课堂上添加一种方法?" 我们一直在四处走动(以一种很好的方式).我的一般回答是,它是工具带中的另一个工具,他的回答是它是一种无用的工具浪费......但我认为我会得到一个更"开明"的答案.
有哪些场景你使用了你不能(或不应该)使用的方法添加到你自己的类上的扩展方法?
我有一个动态创建的表单.这是一个winForms应用程序.
此表单只是一个菜单和一系列文本框和标签.为了这个例子,你可以忽略标签.
我的问题是:当我在文本框中编辑内容时,然后单击菜单发出"保存",最后一个文本框中的文本仍然没有发出其"验证"方法.这似乎是因为控件仍然具有焦点,并且菜单位于单独的线程中.
当用户点击"保存"时,如何强制验证事件?我不知道用户所在的文本框(如果有的话),并且SomeKnownControl.Focus();在"保存"功能中发布似乎没有帮助.
我正在编写一个应用程序来管理用户对文件的访问.一个很长的故事的简短版本是我必须使用目录和文件priveleges来做到这一点.我们便宜的CEO没有文件管理系统......
无论如何...除了用户可以查看目录中的文件但实际上没有看到文件内容的情况之外,我已经完成了所有工作.(文件中可能存在敏感的HR数据.)
我尝试了FileSystemRights.ListDirectory,但似乎(发送MS文档)也将ReadData设置为true.我关闭ReadData(读取文件的能力),我突然再次无法访问该目录.两者似乎有联系.
有权获得许可的想法吗?
我目前的代码是:
SetSecurity(pth, usr, FileSystemRights.ListDirectory, AccessControlType.Allow);
...
public void SetSecurity(string dirName, string account,
FileSystemRights rights, AccessControlType controlType)
{
// Get a FileSecurity object that represents the
// current security settings.
DirectorySecurity dSecurity = Directory.GetAccessControl(dirName);
dSecurity.AddAccessRule(new FileSystemAccessRule(account, rights, controlType));
// Set the new access settings.
Directory.SetAccessControl(dirName, dSecurity);
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
- 杰瑞
我看到数据绑定Windows窗体控件中的答案在失去焦点之前无法识别更改.
但这并没有完全回答我的问题.我有完全相同的情况.在ToolStrip_click上,我浏览了所有控件并强制执行"WriteValue()",但它仍然会在保存之前恢复到之前的值.任何人都可以建议我如何解决这个问题?我错误地实现了这个吗?
(参见当前(非工作)解决方案的代码.)
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Make sure that all items have updated databindings.
foreach (Control C in this.Controls)
{
foreach (Binding b in C.DataBindings)
{
// Help: this doesn't seem to be working.
b.WriteValue();
}
}
}
Run Code Online (Sandbox Code Playgroud)
代码现在变得更加简单,但它是一个相当大的黑客.我很高兴知道是否有更"适当"的解决方案.
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
// Make sure that all text fields have updated by forcing everything
// to lose focus except this lonely little label.
label44.Focus();
}
Run Code Online (Sandbox Code Playgroud) 我有一个富文本框,可能包含一个字符串,其中包含粗体,斜体,甚至不同的字体和大小的元素.如果我选择整个字符串,包括所有差异,我如何"加粗"该字符串而不将整个字符串转换为只有"粗体"属性的通用字体?
例如:我想把"这是一些 text "变成" 这是一些 text "
请注意,"有些"仍然是斜体,"text"仍然是不同的字体.
我目前所拥有的是相当简单的:
private void tsBold_Click(object sender, EventArgs e)
{
if (rtb.SelectionFont == null) return;
Font f;
if (tsBold.Checked)
f = new Font(rtb.SelectionFont, FontStyle.Bold);
else
f = new Font(rtb.SelectionFont, FontStyle.Regular);
rtb.SelectionFont = f;
rtb.Focus();
}
Run Code Online (Sandbox Code Playgroud)
当然,这将使用完全相同的字体到整个选择.有没有办法只是将"粗体"附加到现有字体?
答案 虽然下面的"官方"答案只是冰山一角,但这是我在正确方向上所需要的推动力.谢谢你的提示.
这是我的正式修复:
我将它添加到我的RichTextBox对象:
/// <summary>
/// Change the richtextbox style for the current selection
/// </summary>
public void ChangeFontStyle(FontStyle style, bool add)
{
//This method should handle cases that occur when multiple fonts/styles are selected …Run Code Online (Sandbox Code Playgroud) 使用C#3.0,我知道你可以使用'this'命名扩展方法.
我正在尝试扩展Math.Cos(双弧度)以包含我的新类.我知道我可以在现有的课程中创建一个"Cos"方法,但我只是想看看如何/为了练习这样做.
在尝试了一些新的东西之后,我回到了SO以获得输入.我被卡住了.
这就是我现在所拥有的......
public class EngMath
{
/// ---------------------------------------------------------------------------
/// Extend the Math Library to include EngVar objects.
/// ---------------------------------------------------------------------------
public static EngVar Abs(this Math m, EngVar A)
{
EngVar C = A.Clone();
C.CoreValue = Math.Abs(C.CoreValue);
return C;
}
public static EngVar Cos(this Math m, EngVar A)
{
EngVar C = A.Clone();
double Conversion = 1;
// just modify the value. Don't modify the exponents at all
// is A degrees? If so, convert to radians.
if (A.isDegrees) Conversion …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序正在查看旧数据的一些文件.为了确保我们不破坏好项目,我将文件复制到临时位置.我正在检查的一些目录是源代码目录,它们有.svn文件夹.我们使用Subversion来管理我们的代码.
一旦我搜索了所有文件,我想删除临时缓存.听起来很简单吧?
出于某种原因,我的所有.svn目录都不会从缓存中删除.他们崩溃了应用程序.
由于原因(太深入了这里),我必须使用临时文件夹,因此出于政治原因,"扫描原始文件"是不可能的.
我可以进入资源管理器并删除它们.没问题.没有警告.只是删除.但代码崩溃,"访问{file}被拒绝".我对这个问题的态度很有帮助,所以任何帮助都会受到赞赏.
虽然我为了你的理智而将函数简化为LITTLE,但代码REALLY就是这么简单.
List<string> tmpCacheManifest = new List<string>();
string oldRootPath = "C:\\some\\known\\directory\\";
string tempPath = "C:\\temp\\cache\\";
foreach (string file in ListOfFilesToScan)
{
string newFile = file.Replace(oldRootPath, tempPath);
// This works just fine.
File.Copy(file, newFile);
tmpCacheManifest.add(newFile);
}
// ... do some stuff to the cache to verify what I need.
// Okay.. I'm done.. Delete the cache.
foreach (string file in tmpCacheManifest)
{
// CRASH!
File.Delete(file);
}
Run Code Online (Sandbox Code Playgroud)
foreach (string file in ListOfFilesToScan)
{
string newFile = file.Replace(oldRootPath, tempPath); …Run Code Online (Sandbox Code Playgroud) 我有一个项目,我正在尝试将序列化对象发送到服务器,然后等待"OK"或"ERROR"消息返回.
我似乎遇到了类似的问题:TcpClient发送/关闭问题
问题是,我似乎能够发送原始对象的唯一方法是关闭连接,但然后(当然)我迫不及待地想看看服务器是否成功处理了对象.
private void button4_Click(object sender, EventArgs e)
{
RequestPacket req = new RequestPacket();
/// ... Fill out request packet ...
/// Connect to the SERVER to send the message...
TcpClient Client = new TcpClient("localhost", 10287);
using (NetworkStream ns = Client.GetStream())
{
XmlSerializer xml = new XmlSerializer(typeof(RequestPacket));
xml.Serialize(ns, req);
/// NOTE: This doesn't seem to do anything....
/// The server doesn't get the object I just serialized.
/// However, if I use ns.Close() it does...
/// but then …Run Code Online (Sandbox Code Playgroud) 这是设置:我已经创建了一个用户控件MyUserControl.在此控件上是一个简单的标签.当我在表单上删除此控件的新实例时,我希望标签是控件的名称.例如,如果这是控件的第一个实例,VStudio会自动将其名称设置为"myUserControl1".我只想把标签读作"myUserControl1".如果这是第五个控件,VStudio会将其命名为myUserControl5.我希望标签能够相应改变......但仅限于尚未设置的标签.一旦我将其设置为"标签",它应该保持不变.
我觉得这很容易.在构造函数中,设置label1.Text = this.Name.但后来我意识到,在实例化时,这个名字只是MyUserControl.它还没有被VisualStudio和CONTAINING InitializeComponent()方法命名.
啊! 我只是覆盖"名称"字段.设置完成后,检查DesignMode并更新标签!...但我无法覆盖名称.它不是虚拟的或抽象的.我可以使用"新"强制它,但是,它永远不会发射,从而击败目的.
我可以用哪个事件来表示设计师何时命名控件?我知道当他们放弃对窗体的控制时,redmond人会一直这样做,所以这很有可能.我实际上对这个小谜语感到很难过.
我在表单上有一个WebBrowser控件,但在大多数情况下它仍然对用户隐藏.它可以处理一系列登录和其他任务.我必须使用此控件,因为有大量的Javascript来处理登录.(即,我不能只是切换到WebClient对象.)
跳了一下之后,我们最终想要下载一个PDF文件.但是,不是下载,而是在webBrowser控件中显示该文件,用户无法看到该控件.
如何下载PDF而不是将其加载到浏览器控件中?
c# ×9
winforms ×5
.net ×1
data-binding ×1
download ×1
file-access ×1
richtextbox ×1
sockets ×1
tcp ×1
tcpclient ×1