我试图清除ToolStripDropDownButton中的所有项目.由于它们是一次性的,我在每个上面都使用dispose方法.但是我看到在调用dispose()方法之后,IsDisposed属性仍然返回false.为什么这样,我如何检查是否在任何对象上调用Dispose()?在我目前的项目中,这不是一个问题(我希望),但我真的想知道这里发生了什么......
我的代码到目前为止:
private void ClearDropDownAccessConnections()
{
ToolStripItem button = null;
for (int i = toolStripDropDownButtonAccess.DropDownItems.Count - 1; i > 0; i--)
{
button = toolStripDropDownButtonAccess.DropDownItems[i] as ToolStripItem;
if ((button.Tag != null) && ((int)button.Tag == 10))
{
toolStripDropDownButtonAccess.DropDownItems.Remove(button);
button.Dispose();
//IF I CHECk HERE THEN button.IsDisposed IS STILL FALSE }
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用Delphi的小工具,它从文件或剪贴板中收集url,然后使用如下内容构建一个名为test.htm的文件:
<!DOCTYPE html>
<html>
<body>
<p>Click the button retrieve the links....</p>
<button onclick="myFunction()">Click me</button>
<p id="demo"></p>
<script>
function myFunction() {
window.open('http://www.speedtest.net/', '_blank');
window.open('www.speedtest.net/', '_blank');
and so on...
}
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我们的想法是单击按钮,然后为myFunction中的每个url创建一个新选项卡(或窗口).这有效,但有一个小问题.
在代码示例中,有2个url,一个带有http://前缀,另一个带有它.第一个URL按预期工作,并使用以下URL创建一个新选项卡(或窗口):
http://www.speedtest.net
Run Code Online (Sandbox Code Playgroud)
第二个'window.open'不能像我预期的那样工作.这个'window.open'将在新标签(或窗口)中创建以下网址
file:///c:/myApplicaton/www.speedtest.net
Run Code Online (Sandbox Code Playgroud)
正如您已经想到的那样,该应用程序是c:\ myApplication中的可执行文件
所以我的问题是,有没有办法使用'window.open'创建一个新的选项卡(或窗口)而不将应用程序的路径放在网址前面?如果使用'window.open'无法做到这一点,还有其他办法吗?
或者是唯一的方法来让应用程序将http://放在每个没有它的URL前面?
我正在尝试使用C#中的FluentFTP实现FTP传输.获取目录列表非常简单,但我坚持下载文件.
我发现有一篇文章在其评论中有一个例子,但它不会编译,因为我无法找到FtpFile类的来源.
有没有人举例说明我是如何使用FluentFTP从ftp服务器下载文件的?
编辑:我在这里找到了一些例子https://github.com/hgupta9/FluentFTP但是没有关于如何实际下载文件的例子.
在本文中免费FTP库有一个例子,但它不编译.这是一个例子
FtpClient ftp = new FtpClient(txtUsername.Text, txtPassword.Text, txtFTPAddress.Text);
FtpListItem[] items = ftp.GetListing();
FtpFile file = new FtpFile(ftp, "8051812.xml"); // THIS does not compile, class FtpFile is unknown
file.Download("c:\\8051812.xml");
file.Name = "8051814.xml";
file.Download("c:\\8051814.xml");
ftp.Disconnect();
Run Code Online (Sandbox Code Playgroud)
编辑:解决方案
我发现的文章包含一个让我走错方向的例子.似乎曾经有过一种下载方法,但现在已经很久了.所以答案就是让它去使用OpenRead()方法来获取流,而不是将该流保存到文件中.
我试图阻止我的应用程序被Windows关闭.该应用程序在Windows 8上运行并以XE6编写.我尝试了下面的代码,但它似乎完全被忽略了.为了测试它,我只需通过任务管理器向其发送"结束任务".我需要的是一种方法,让我的应用程序完成它在用户关闭应用程序时所执行的操作,由Windows关闭的任务管理器完成.正常关闭不是问题,这由FormCloseQuery事件处理.但其他两种方法我都无法工作.直到windows XP,通过捕获wm_endsession和wm_queryendsession很容易,从vista开始你需要使用ShutDownBlockReasonCreate,它返回true但似乎无论如何都不起作用.
procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
function ShutdownBlockReasonCreate(hWnd: HWND; Reason: LPCWSTR): Bool; stdcall; external user32;
function ShutdownBlockReasonDestroy(hWnd: HWND): Bool; stdcall; external user32;
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
inherited;
Msg.Result := lresult(False);
ShutdownBlockReasonCreate(Handle, 'please wait while muting...');
Sleep(45000); // do your work here
ShutdownBlockReasonDestroy(Handle);
end;
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
inherited;
Msg.Result := lresult(False);
ShutdownBlockReasonCreate(Handle, 'please wait while muting...');
Sleep(45000); // do your work here
ShutdownBlockReasonDestroy(Handle);
end;
Run Code Online (Sandbox Code Playgroud)
更新
将消息结果更改为true并删除睡眠不会改变任何内容.
procedure TForm1.WMEndSession(var …
Run Code Online (Sandbox Code Playgroud) 我有一个varchar列,由另一个我无法控制的进程填充,用逗号分隔的值填充.
现在我需要找到该列的一部分存在于同一列中的所有行,在另一行中
例
declare @table table (value varchar(50))
insert into @table values ('NB,BD,FR'), ('BD,GK'), ('SL,SR')
select * from @table
Run Code Online (Sandbox Code Playgroud)
所以表中包含
value
-----
NB,BD,FR
BD,GK
SL,SR
Run Code Online (Sandbox Code Playgroud)
从上面的例子我想得到
value
-----
NB,BD,FR
BD,GK
Run Code Online (Sandbox Code Playgroud)
因为BD
两行中都存在一个值(在这种情况下可以是任何东西)
这可以在sql中完成吗?
我最想念的是这里的内容,
请参见我调试会话的图像。
(items[i] is MailItem)
根据调试器为FALSE,但仍输入该if
语句。
我在这里想念什么?
。
供参考,这是此方法的完整代码
private MailItem GetMailBySubject(DateTime dateReceived, string subject)
{
MailItem Result = null;
Microsoft.Office.Interop.Outlook.Application OutlookIns = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.NameSpace olNamespace = OutlookIns.GetNamespace("MAPI");
MAPIFolder myInbox = olNamespace.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
Items items = myInbox.Items;
int count = items.Count;
MailItem mail = null;
int i = 1; //DO NOT START ON 0
while ((i < count) && (Result == null))
{
if (items[i] is MailItem)
{
mail = (MailItem)items[i];
if ((mail.ReceivedTime.ToString("yyyyMMdd hh:mm:ss") == dateReceived.ToString("yyyyMMdd hh:mm:ss")) && …
Run Code Online (Sandbox Code Playgroud) 我有一个属性ggFileName定义如下:
private string _ggFileName = "";
public string ggFileName
{
get
{
return _ggFileName;
}
set
{
_ggFileName = value;
ReadXmlSchemaFromFile();
}
}
Run Code Online (Sandbox Code Playgroud)
在为ggFileName赋值时,方法ReadXmlSchemaFromFile(); 叫做.到现在为止还挺好.
我的问题是,当我为属性ggFileName分配它已经包含的相同值时,没有任何反应.在为其分配不同的值之前,不会调用setter.
我同意在几乎所有情况下这都是完全符合逻辑的,但在我的情况下它会引发一个问题.如果ggFileName中的文件在我的应用程序之外更改怎么办?将同一文件再次分配给ggFileName不会调用我的setter,因此也不会调用ReadXmlSchemaFromFile().所以现在我必须将一个虚拟文件设置为属性ggFileName,然后再将相同的文件再次分配给ggFileName以使其正常工作.
C#似乎想通过在分配相同值时不调用setter来帮助我,我怎么能告诉c#停止帮助我呢?
我不知道C#这样做,在我所有的setter方法我有这样的代码:(!值= _myValue)如果{做二传手逻辑在这里}我想我不需要写检查了不是?
只是为了让事情更清楚,因为人们似乎不理解我的问题.1.我的setter确实被调用,但仅在分配不同的值时2.我不想使用方法,因为在设置属性之后我想要完成一些检查并且我不希望我的类的任何其他用户能够绕过检查.属性的用途是什么?3.分配我无法发布的值的代码.它是自定义控件的属性,设计者通过编辑对象检查器来调用它.同样,只要我继续为它提供不同的价值,它就会起作用
谢谢
我喜欢Delphi的是所有控件和组件的代码都可用.它全部在所谓的VCL(可视化组件库)中,这在设计自定义控件和组件时非常有用.总而言之,Delphi中的每个控件和组件都是用Delphi编写的,所以将这些代码包含在Delphi中是有意义的,这样我们就可以查看它甚至调试它.
所以我想知道C#是否也是如此?我怀疑像TextBox这样的控件是用C#编写的,所以可以像在Delphi中那样查看代码吗?
我有一个方法可以接受可以为null的参数,因为它是从具有可空列的表中填充的.
private void test(int ID, int? value)
{}
Run Code Online (Sandbox Code Playgroud)
在调用这个方法时,我需要一些方法来为它提供一个可以为空的变量,这就是我的问题.我试过这个:
foreach (DataRow row in DataTable1.Rows)
{
test((int)row["ID"], (int?)row["value"]);
}
Run Code Online (Sandbox Code Playgroud)
但它给了我一个投射错误
"指定演员表无效"
所以我尝试了这个:
foreach (DataRow row in DataTable1.Rows)
{
test((int)row["ID"], (int)row["value"] ?? DBnull.Value);
}
Run Code Online (Sandbox Code Playgroud)
还有这个 :
foreach (DataRow row in DataTable1.Rows)
{
test((int)row["ID"], (int)row["value"] ?? null);
}
Run Code Online (Sandbox Code Playgroud)
但他们都给我错误
"运算符??不能应用于int和null类型的操作数
我试过的最后一个是:
foreach (DataRow row in DataTable1.Rows)
{
test((int)row["ID"], (int?)row["value"] ?? null);
}
Run Code Online (Sandbox Code Playgroud)
这个编译,但给出了运行时错误
"指定演员表无效"
那我该怎么做呢?这个想法是参数值用表中的值或null填充.
在我的项目中,我需要删除数据表中的所有记录,所以我尝试了以下代码:
while (DataTable1.Rows.Count > 0)
DataTable1.Rows[0].Delete();
Run Code Online (Sandbox Code Playgroud)
但这是一个无限循环,似乎在Delete()
语句之后Rows.Count
没有改变。
看起来记录仍然存在,但已标记为删除。
所以我将计数更改为:
int count = DataTable1.Select("", "", DataViewRowState.CurrentRows).Count();
Run Code Online (Sandbox Code Playgroud)
所以现在我可以像这样改变我的循环
int count = DataTable1.Select("","",DataViewRowState.CurrentRows).Count();
while (count > 0)
{
DataTable1.Rows[0].Delete(); // THIS IS WRONG NOW
count = DataTable1.Select("","",DataViewRowState.CurrentRows).Count();
}
Run Code Online (Sandbox Code Playgroud)
现在计数确实按预期倒计时,但现在我的声明有问题Rows[0].Delete()
。
它将一遍又一遍地删除同一行。
所以我的问题是,如何找到第一行未删除的行,并将其删除?
换句话说,用 // THIS IS WRONG NOW 注释的行我可以在该行使用什么?
或者有更好的方法来做到这一点吗?我尝试了 DataTable1.Clear() 但在执行时不会生成删除语句adapter.Update(DataTable1);
c# ×7
delphi ×2
winforms ×2
csv ×1
datatable ×1
dispose ×1
fluentftp ×1
ftp ×1
javascript ×1
nullable ×1
properties ×1
setter ×1
shutdown ×1
sql ×1
sql-server ×1