【200顶着有分,急】WebBrowser控件编辑模式CTRL+Z失效的问题 或 怎样禁止弹出文档已修改对话框?

让爱延续 2011-03-18 02:53:37
我要疯,大侠救命啊…


导致Ctrl + Z失效的原因由以下2点连锁引发而导致:

1、为了解决 WebBrowser 控件导航时弹出“保存对话框”,使用了 this.webBrowser.Document.OpenNew(true); // 防止 弹出保存对话框, 该方法指示新的文本改变将会在新窗口中打开。

2、 由原因1导致 webBrowser 控件的编辑模式失效, 表面上看上去还是可以编辑的,但实际上新窗口内部已经不支持编辑了。

这里涉及到了WebBrowser控件的特殊性,它是由三层控件嵌套而成的,外面的两层是大概负责容器、 及 响应用户操作的, 而最内层的则是承载HTML标记,并通过渲染引擎展示HTML内容。当使用webBrowser.Document.OpenNew(true); 方法时,最内层控件应该是一个新的实例, 表面上看上去还是可以编辑的,但实际上内部的新窗口已经不支持编辑了,进而导致了Ctrl + Z的失效![这里也只是一个推断,顺求大侠们佐证…]

测试代码如下:

public partial class FrmTest : Form
{
// 界面上有一个WebBrowser 和 4个Button

private string strUrl = "http://www.cnblogs.com/08shiyan";

public FrmTest()
{
InitializeComponent();
}

/// <summary>
/// 编辑模式
/// </summary>
public void EditMode()
{
if (this.webBrowser1.Document != null)
{
mshtml.IHTMLDocument2 doc = this.webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;
doc.designMode = "on";
}
}

/// <summary>
/// 启用浏览模式
/// </summary>
public void BrowseMode()
{
if (this.webBrowser1.Document != null)
{
mshtml.IHTMLDocument2 doc = this.webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;
doc.designMode = "off";
}
}

// 请确保该按钮是应用程序启动后第一次被点击
private void button1_Click(object sender, EventArgs e)
{
this.webBrowser1.DocumentText = string.Empty;
this.webBrowser1.Document.Write(string.Format("<BODY>{0}我的誓言博客2</BODY>", this.strUrl));
this.EditMode();

this.webBrowser1.Document.OpenNew(true);
this.webBrowser1.Document.Write(string.Format("<BODY>{0}我的誓言博客2</BODY>", this.strUrl));

// 注意此时Ctrl + Z 撤销操作将会失效
}

// 请确保该按钮是应用程序启动后第一次被点击
private void button2_Click(object sender, EventArgs e)
{
this.webBrowser1.DocumentText = string.Empty;
this.webBrowser1.Document.Write(string.Format("<BODY>{0}我的誓言博客2</BODY>", this.strUrl));
this.EditMode();

this.webBrowser1.Document.OpenNew(true);
this.webBrowser1.Document.Write(string.Format("<BODY>{0}我的誓言博客2</BODY>", this.strUrl));

this.EditMode(); // 与button1的差别是再次启用编辑模式 // 注意此时Ctrl + Z 撤销操作也会失效
}

// 请确保该按钮是应用程序启动后第一次被点击
private void button3_Click(object sender, EventArgs e)
{
this.webBrowser1.DocumentText = string.Empty;
this.webBrowser1.Document.Write(string.Format("<BODY>{0}我的誓言博客2</BODY>", this.strUrl));
this.EditMode();

this.webBrowser1.Document.OpenNew(true);
this.webBrowser1.Document.Write(string.Format("<BODY>{0}我的誓言博客2</BODY>", this.strUrl));

this.BrowseMode(); // 与button2 的区别是 先关闭编辑模式,再启用编辑模式
this.EditMode();

// 此时 Ctrl + Z 可以使用 ,但此时this.webBrowser1.Document.Body 为null了,杯具中、还是不能解决,问题似乎陷入死循环了。
}

// 重启应用程序
private void button4_Click(object sender, EventArgs e)
{
Application.Restart();
}

}


根据以上得出结论:
在“编辑模式”下: this.webBrowser.Document.OpenNew(true); 方法会打开一个新的“内部窗口”,而新窗口中“编辑模式”出现问题,导致Ctrl + Z ,Ctrl +Y操作失效。 此时 需要先关闭 “编辑模式” 然后再打开“编辑模式” Ctrl + Z, Ctrl +Y 才能正常使用,而Ctrl + Z可以使用了,但是Body为null了,html标记丢失, 更加杯具… 死循环啦…

------------------------------------------------------------------------------------------------------------

唉,为了能让Ctrl + Z能够使用,只能把 this.webBrowser.Document.OpenNew(true); 方法去掉, 可是去掉后,又会不断的弹框。

设置了 AllowNavigation 设为 false、
----------------结果对话框还是弹-------------------------------

在WebBrower1的Navigating 事件中加以下代码就没有提示了。

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
webBrowser1.Document.Write("<script>functionshowModalDialog{return;}</script>");
}
------------------------这个也无效----------------------------

我要疯,大侠救命啊… 给个解决方法只要能够保证CTRL + Z可用、Body 不为Null,不弹对话框就结贴给分啦。


...全文
358 点赞 收藏 20
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
引用 19 楼 ZaiDuXinLing 的回复:
[Quote=引用 7 楼 qldsrx 的回复:] 一、在button3_Click的最后添加Application.DoEvents(); [/Quote] 谢谢!
楼主写的文章确实很好,赞一个
回复
让爱延续 2011-03-19
[Quote=引用 7 楼 qldsrx 的回复:]
一、在button3_Click的最后添加Application.DoEvents();
[/Quote]

谢谢!
回复
让爱延续 2011-03-19
问题解决,起早来结贴。

解决方法:

在更改DocumentText属性前 先启用浏览模式,更改完属性值后在启用编辑模式。感觉这种方式是最合理,不会再额外产生什么副作用了吧,但愿啊。。。
回复
让爱延续 2011-03-19
[Quote=引用 11 楼 win32fanex 的回复:]
AllowNavigation = false方法不可用。

[/Quote]

这里的AllowNavigation = false不可用 是指的, 设置改项值为false 后, 对话框也是会弹出来。
回复
xiangyun_1224 2011-03-18
C#的WebBrowser? 这个只有打断点一点点调试啦。
回复
大狗狗 2011-03-18
AllowNavigation = false方法不可用。

为什么会出现保存对话框?因为编辑状态下的WebBrowser执行了Navigate。这个Navigate是楼主您所执行呢,还是其它方面造成不在楼主计划内呢?如果是前者,那AllowNavigation = false后,您就没办法执行Navigate了。如果您本来就不需要执行Navigate,那就在源头防止WebBrowser去导航到您计划外的地方,而不是用AllowNavigation来修补。

可行方法还是我前面所说的:
适时设置WebBrowser的编辑模式。当你执行Navigate时,将其置于阅读状态(阅读状态下不会弹保存对话框)。加载文档完毕后,再将Webbrowser设为编辑模式。
回复
让爱延续 2011-03-18
[Quote=引用 8 楼 win32fanex 的回复:]
适时设置WebBrowser的编辑模式。当你执行Navigate时,将其置于阅读状态。加载文档完毕后,再将Webbrowser设为编辑模式。
[/Quote]

该吃饭了,晚上再看喽。
回复
让爱延续 2011-03-18
[Quote=引用 6 楼 dongxinxi 的回复:]
别处看的:

//在浏览器完成操作时,使AllowNavigation = false
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.webBrowser1.AllowNavigation = false;
}
在设置We……
[/Quote]

好像还是有问题,不过谢谢您提醒DocumentCompleted事件。 晚上再细考虑考虑
回复
大狗狗 2011-03-18
当WebBrowser在编辑状态时,你再执行Navigate就会弹出讨厌的保存对话框。以前我为了解决这个问题,曾试过三种方法:

第一种就是你所说的OpenNew方法。该方法最不可取。除了你所述问题外,它还有另一致命问题:使用Ctrl+V将网页内容粘贴进Webbrowser时可能产生异常。

第二种方法是使用JS来屏蔽保存对话框。各种代码都试过了,不起作用的。

第三种方法是重载WebBrowserSite,重写ShowMessage函数。它可以拦截绝大多数WebBrowser弹出来的对话框,偏偏对那个保存对话框不起作用。


目前我采用的办法是:
适时设置WebBrowser的编辑模式。当你执行Navigate时,将其置于阅读状态。加载文档完毕后,再将Webbrowser设为编辑模式。

回复
qldsrx 2011-03-18
[Quote=引用 2 楼 zaiduxinling 的回复:]
引用 1 楼 qldsrx 的回复:
请问是怎么个Body为null了,我测试你的代码,发现Body始终是存在的,未曾为空,难道说你的代码没有给全?


在button3事件中 打个断点,在执行完this.EditMode();方法后 body 为 Null
[/Quote]
哦,原来你是在一起执行的时候,临时为null了,我是单独在外部添加了个按钮,点击查看显示正常的。
解决方法有2个:
一、在button3_Click的最后添加Application.DoEvents();
二、在button2_Click的第一次“this.EditMode();”后面添加“this.BrowseMode();”,先关闭编辑模式后再OpenNew
回复
别处看的:

//在浏览器完成操作时,使AllowNavigation = false
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
this.webBrowser1.AllowNavigation = false;
}
在设置WebBrowser.DocumentText 的值的前面加下以下两行代码
//这两行是屏蔽改变WebBrowser值时,弹出的如上面所说的那个对话框
webBrowser1.AllowNavigation = true;
webBrowser1.Document.OpenNew(true);
回复
mark620 2011-03-18
我顶!








论坛签名======================================================================

ZaiDuXinLing:你好!
截至 2011-03-18 14:53:37 前:
你已发帖 4 个, 未结贴 0 个;
结贴率为: 100.00%

当您的问题得到解答后请及时结贴.

http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html

如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖

如何给自己的回帖中也加上签名?
http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx
回复
nishierzhizhu 2011-03-18
不懂帮顶
回复
让爱延续 2011-03-18
[Quote=引用 1 楼 qldsrx 的回复:]
请问是怎么个Body为null了,我测试你的代码,发现Body始终是存在的,未曾为空,难道说你的代码没有给全?
[/Quote]

在button3事件中 打个断点,在执行完this.EditMode();方法后 body 为 Null
回复
qldsrx 2011-03-18
请问是怎么个Body为null了,我测试你的代码,发现Body始终是存在的,未曾为空,难道说你的代码没有给全?
回复
相关推荐
发帖
C#
创建于2007-09-28

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2011-03-18 02:53
社区公告

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