winform 静态方法 不能使用winform 控件 怎么解决?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了winform 静态方法 不能使用winform 控件 怎么解决?相关的知识,希望对你有一定的参考价值。

winform程序中静态方法调用控件的方式

类似java前端的var that = this,然后that.XXX这样

具体步骤,首先确定你是一个主窗体应用

    在public partial class Form1 : Form 下创建一个Form1的变量

    public static Form1 actform;(为了在之后用actform代表form1,来获取他的所包含控件)

    在public Form1() InitializeComponent();下加上"that= this"

    即:actform = this;(这是就把form1绑定到actform上了)

3在你自己的static方法中,使用actform.form1的控件名称即可

例如画图:

在form1中创建一个pictureBoxA的画图框

在静态方法中如此绘图

Graphics graph =Graphics.FromHwnd(actform.pictureBoxA.Handle); graph.DrawImage(actform.pBitmap, actform.prcPBox, actform.prcSource, GraphicsUnit.Pixel);

例如打日志:

在form1中创建一个ListView的框子

在静态方法中如此打日志

actform.Logview.Items.Add( DateTime.Now.ToString("yyyyMMddhhmmss"));

参考技术A 你是问静态方法,为什么无法访问窗体里的控件吗?
窗体里的控件是要创建实例才能访问的,
而静态方法是无需实例就可以访问的,所以静态方法不能直接访问当前类的实例方法或成员

举个例子,人这个类,属性是高级动物,但是人这个类型没有姓名或性别,只有具体到单个人(实例)才有姓名或性别
所以人这个类型无法访问姓名或性别追问

你说的很有道理,但是我问题还是没解决啊。

追答

把静态方法的static去掉就ok了,
或者静态方法添加一个参数,传入窗体

追问

要是去static 方便的话,我肯定去了;

我要再方法外定义 Thread,方法参数只能是 静态,所以方法只能是静态;

您说的静态 方法添加一个参数 传入窗体 是什么意思呢?

参考技术B 本来就不能使用。。。。没有解决方法 参考技术C 使用委托方法!追问

能举例一下么?

追答

给你个链接,上面讲的比较详细!
http://blog.csdn.net/sugar_tiger/article/details/4125653
http://blog.csdn.net/accpyy/article/details/4155857

参考技术D 贴下异常代码和图片呗!

C# Winform - DAL 和 BLL - 使用静态方法好吗?

【中文标题】C# Winform - DAL 和 BLL - 使用静态方法好吗?【英文标题】:C# Winform - DAL and BLL - usage of static methods is good? 【发布时间】:2018-12-15 21:11:27 【问题描述】:

我遇到的疑问是关于在winform应用程序中实现DAL和BLL访问层期间使用静态方法的问题。

我知道这里有很多关于这个主题的文章,但我没有找到任何可以回答我的具体问题的文章。

简要介绍:我正在开发一个 Windows 窗体应用程序,该应用程序将被许多用户使用(每个用户在虚拟机上都有自己的帐户 - 所以基本上每个应用程序实例都将由不同的用户帐户执行)。 因为我不需要保留许多对象的状态,所以我决定使用(直到现在我的意思是某些操作)静态方法,特别是在 DAL 和 BLL 中执行以下操作:GetUserProfiles、GetProfileByUserName、AddNewUser、UpdateUserByUserID 等...或使用某些信息(例如:当前正在运行应用程序的用户、从 DB 中查找数据等)保持应用程序的状态,这些信息预计在应用程序的整个执行过程中保持不变。

我的问题/疑问:使用静态方法实现对数据库的这些访问部分是否正确,因为它们只是为了检索信息而需要,并且在我看来,不需要状态,因为每次它们都会执行它就像一个新的执行和以前的状态是不必要的?

你认为我的思维方式和方法是正确的,还是我做错了我目前看不到的事情?

谢谢大家的回复,并给我一些更好的建议。

【问题讨论】:

【参考方案1】:

虽然这个问题的答案很大程度上取决于您的应用程序/安全性/性能/时间的大小......但对于大多数专业开发人员来说,这被称为“最佳实践”,这很重要。

也有人可能会说KISS(保持简单和愚蠢),但如果您要考虑未来,您应该继续遵循最不为人知的 DAL 最佳实践进行设计。

假设明年你的老板命令你在代码中使用实体框架,那么你会怎么做?如果您的代码只是一个成熟的代码,则需要繁重的工作量才能将所有内容更改为 EF。或者如果您更改数据库引擎 Oracle/MySql/SqlServer 会发生什么?如果那里有很多代码,那么你就有很大的麻烦了。

如果您不想与复杂的模式作斗争,我建议至少将接口与 Factory Design Patterin 结合使用作为您的 DAL。

另一件要提的事情是,使用静态类使每个用户的 DAL 单线程对于 Win Form 应用程序来说并不是很好。

因此,如果您希望应用程序具有灵活性和多线程能力,这不是最佳做法,但如果您只是希望应用程序在那里工作,那么您就是。

【讨论】:

我不遵循你关于线程的声明。运行(多线程)任务需要委托,委托可以由静态或实例方法组成。无论如何,每个用户都会将 winforms 应用程序作为自己的进程启动。不过我同意其他观点。 @simone *** 不是用来聊天的,如果你想讨论使用chat.***.com 感谢您的回复。我认为这个应用程序,因为它是针对一个非常小的公司,未来不会长大。基本上它应该保持原样。关于您关于 DAL 的那句话,您能否解释一下原因,因为该应用程序将由具有不同帐户的不同用户执行,因此在不同的环境中?现在我正在访问 SQL Server 数据库并使用存储过程。根据这些新信息,您是否发现使用这种静态方法的方法存在任何安全漏洞,或者您是否发现不同用户使用此应用程序存在任何问题? 换句话说:您是否建议严格更改我的代码并将所有内容转换为实例方法而不是静态方法? @Simone 我认为经验很宝贵,如果它是一个小应用程序,您可以按照您说的方式编写它。实施安全评估实际上需要其他东西,如身份验证和使用服务,所以按照你的方式去做。看看他们的代码,看看他们是如何编码的,审查他们的代码,看看他们如何评估这些问题。【参考方案2】:

静态成员(方法、属性等)无法从面向对象中受益,即多态、继承、接口实现等。

如果您使用的是存储库模式,您可以概括事物并保留将特定方法添加到特定存储库的能力。存储库可以描述为:

public interface IRepository<T>

    T GetById(int id);
    List<T> GetAll();
    void Create(T entity);
    void Delete(T entity);
    void Update(T entity);

这只是一个示例,您可以根据自己的需要进行定制。

作为灵活性的示例,假设 CSV 导出器接受具有方法的存储库

public void Export<T>(string file, IReporistory<T> repository)

    ...
    List<T> result = repository.GetAll();
    ...

在实现此接口的UserProfileRepository 中,您仍然可以添加未在接口中定义的方法GetProfileByUserName

如果您希望它更静态,可以将接口实现为singletons。

【讨论】:

非常坚定的答案,我对存储库设计模式很感兴趣,您描述它的方式非常简单,如果您知道任何好的女巫会像您一样使用该模式,您能否在 cmets 中提供教程链接此处描述。 如果你用谷歌搜索“存储库模式”,你会发现从非常基本的实现到极其复杂的实现的无数答案。有些是硬编码的,而另一些则是generic。它们在使用的技术上也有所不同(如 ADO.NET、EF 等)。所以很难推荐一个而不是另一个。 通用存储库被认为是一种反模式:***.com/a/51781877/5779732

以上是关于winform 静态方法 不能使用winform 控件 怎么解决?的主要内容,如果未能解决你的问题,请参考以下文章

WinForm窗体间传值的方法

WinForm 进程和线程

2019-3-26WinForm窗体间如何传值的几种方法

2021-05-21 仓库温控系统(Winform) 05 获取类属性静态方法PropertyHelper

winform如何全局调用一个外部的类?

菜鸡学习笔记--WinForm控件的异步调用