问题定义:
用户在工作中需要把datagrid里的电话号码列其中的一个电话号码复制到windowsForm里的textbox里,然后在winForm里进行操作。由于粗心的用户经常复制错误,所以winForm程序的处理也是错误的。
功能需求:
为了避免用户复制错误导致程序出错(输入的是垃圾,输出的也是垃圾)。现在决定做一个程序替用户复制。
设计方案:
在datagrid里加一个模版列,用到html的文本控件,在javascript里引进fso对象,写文本文件。因在B/S系统上采用了Javascript写客户机本地文件的技术,所以需要在客户上设定IE的安全级别内的设置才能顺利在本地硬盘写入临时文件。具体设置如下:
打开IE程序,点菜单工具à选项,打开选项窗口,并点到安全页面。
点“自定义级别”按钮,打开如下窗口,在“ActiveX控件和插件”列中将“对没有标记为安全的ActiveX控件进行初始化和脚本运行”设为“启用”。
点击“确定”回到IE窗口即可。
最后,在winForm程序里创建线程读取文件,如果文件不存在,线程终止。
代码编写:
winform里的代码
private void mystart()
{
if(File.Exists("d://phone.txt")) //文件存不存在??
{
if(this.textBox1.Text.Length<11)
{
this.read_file(); //读取文件
System.Threading.Thread.Sleep(2000);
}
}
else
{
System.Threading.Thread.Sleep(1000);//文件不存在,关闭线程
}
}
private void read_file()
{
//读取文本文件.
try
{
// StreamReader to read from a file.
// The using statement also closes the StreamReader.
using(StreamReader sr=new StreamReader("d://phone.txt"))
{
String line;
while((line=sr.ReadLine())!=null)
{
textBox1.Text=textBox1.Text+line;
}
}
}
catch(Exception ee)
{
textBox1.Text=ee.Message.ToString();
}
}
private void timer2_Tick(object sender, System.EventArgs e)
{
System.Threading.Thread myThread;
myThread=new System.Threading.Thread(new System.Threading.ThreadStart(mystart));
myThread.Start();
//在timer控件里,不停的启动线程。
}
javascript代码:
<script type="text/javascript">
function addr(obj)
{
var aa=obj;
var fso,fj;
fs=new ActiveXObject("Scripting.FileSystemObject");
fj=fs.CreateTextFile("d://phone.txt",true);
fj.WriteLine(aa);//写文件。
}
</script>
datagrid里的模版列代码。
<asp:TemplateField>
<ItemTemplate>
<button id="phone" value='<%# DataBinder.Eval(Container.DataItem,"FromTeleNumber") %>' οnclick="addr(<%# DataBinder.Eval(Container.DataItem,"FromTeleNumber")%>)">
<%# DataBinder.Eval(Container.DataItem, "FromTeleNumber")%>
</button>
</ItemTemplate>
</asp:TemplateField>
这样在datagrid里点击电话号码就可以在winform里的textbox里看到它的值了。