我目前正在编写我的第一个关于C#的程序,而且我对该语言非常陌生(迄今为止只用于C).我做了很多研究,但所有的答案都太笼统了,我根本无法解决问题.
所以这里是我(非常常见)的问题:我有一个WPF应用程序,它从用户填充的几个文本框中获取输入,然后使用它来对它们进行大量计算.它们应该花费大约2-3分钟,所以我想更新进度条和文本块,告诉我当前的状态.此外,我需要存储用户的UI输入并将它们提供给线程,所以我有第三个类,我用它来创建一个对象,并希望将此对象传递给后台线程.显然我会在另一个线程中运行计算,因此UI不会冻结,但我不知道如何更新UI,因为所有计算方法都是另一个类的一部分.经过大量的研究后,我认为最好的方法是使用调度员和TPL,而不是背景工作者,但说实话,我不确定它们是如何工作的,经过大约20个小时的试错和其他答案,我决定问我自己的问题.
这里有一个非常简单的程序结构:
public partial class MainWindow : Window
{
public MainWindow()
{
Initialize Component();
}
private void startCalc(object sender, RoutedEventArgs e)
{
inputValues input = new inputValues();
calcClass calculations = new calcClass();
try
{
input.pota = Convert.ToDouble(aVar.Text);
input.potb = Convert.ToDouble(bVar.Text);
input.potc = Convert.ToDouble(cVar.Text);
input.potd = Convert.ToDouble(dVar.Text);
input.potf = Convert.ToDouble(fVar.Text);
input.potA = Convert.ToDouble(AVar.Text);
input.potB = Convert.ToDouble(BVar.Text);
input.initStart = Convert.ToDouble(initStart.Text);
input.initEnd = Convert.ToDouble(initEnd.Text);
input.inita = Convert.ToDouble(inita.Text);
input.initb = Convert.ToDouble(initb.Text);
input.initc = Convert.ToDouble(initb.Text);
}
catch
{
MessageBox.Show("Some input values are not of …
Run Code Online (Sandbox Code Playgroud) 我有三张桌子:R,S和P.
表R通过外键与S连接; 有应该是S中至少一个的记录,所以我可以加入:
SELECT
*
FROM
R
JOIN S ON (S.id = R.fks)
Run Code Online (Sandbox Code Playgroud)
如果在S中没有记录,那么我没有行,这没关系.
然后表S与P连接,其中记录是P可能存在也可能不存在并且与S连接.
所以我这样做
SELECT
*
FROM
R
JOIN S ON (S.id = R.fks)
LEFT JOIN P ON (P.id = S.fkp)
Run Code Online (Sandbox Code Playgroud)
如果我想将第二个JOIN绑定到S而不是R,如果我可以使用括号,该怎么办?
SELECT
*
FROM
R
JOIN (S ON (S.id = R.fks) JOIN P ON (P.id = S.fkp))
Run Code Online (Sandbox Code Playgroud)
或者这是R,S和P之间笛卡尔积的自然行为?
我在c#中重载了lessthan-operator,我想知道这是否需要检查null.您可以在下面找到一个示例:
public static bool operator <(MyClass x, MyClass y)
{
if (x == null && y == null)
{
return false;
}
if (x == null)
{
return true; //false?
}
if (y == null)
{
return false; //true?
}
return x.Value < y.Value;
}
Run Code Online (Sandbox Code Playgroud)
或者这是正确的:
public static bool operator <(MyClass x, MyClass y)
{
return x.Value < y.Value;
}
Run Code Online (Sandbox Code Playgroud)
我没有找到任何关于此的指示.但也许我错过了什么.
我找不到在MySql存储过程中使用事务的最佳方法.ROLLBACK
如果有任何失败我想要:
BEGIN
SET autocommit=0;
START TRANSACTION;
DELETE FROM customers;
INSERT INTO customers VALUES(100);
INSERT INTO customers VALUES('wrong type');
COMMIT;
END
Run Code Online (Sandbox Code Playgroud)
1)autocommit=0
需要吗?
2)如果第二个INSERT
中断(当然它确实),第一个INSERT
不会回滚.程序只是继续下去COMMIT
.我怎么能阻止这个?
3)我发现我可以DECLARE HANDLER
,我应该使用这条指令还是有更简单的方法来说如果任何命令失败,存储过程应该ROLLBACK
也会失败?
DECLARE HANDLER
工作正常,但由于我有MySql版本5.1我不能使用RESIGNAL
.因此,如果发生错误,将不会通知来电者:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
-- RESIGNAL; not in my version :(
END;
START TRANSACTION;
Run Code Online (Sandbox Code Playgroud) 我有WinForms(VB.NET)的问题.
主窗口是MDI容器.用户打开一个新的子窗口:
然后最大化它,因此窗口正确填充客户区.我的控件已正确锚定(使用IDE属性Anchor)到窗口两侧,以便扩大窗口总是很好地填充客户区:
在这种状态下(客户端窗口最大化),用户打开一个不同的或新的子窗口,但新的窗口控件没有拉伸,即他们不"理解"他们应该拉伸!
这特别令人讨厌,因为如果用户试图恢复窗口,那么控件就会被拉伸,所以它们会消失(看不到列表视图了)!
这是一个错误吗?我怎么解决这个问题?
编辑:根据Hans Passant的评论,我创建了一个新的简单项目,它可以正常工作.所以我调查了一下与我的真实项目和样本有什么不同.不同的是,在我的项目中,我动态创建表单.
我在工具栏上动态创建了许多按钮.当用户单击按钮时,这是执行的代码:
Private Sub buttonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
Cursor.Current = Cursors.WaitCursor
Dim b As Button = CType(sender, Button)
Dim assem As Assembly = Assembly.GetExecutingAssembly()
Dim formType As Type = assem.GetType(CStr(b.Tag))
Dim exFormAsObj As Object = Nothing
Try
exFormAsObj = Activator.CreateInstance(formType)
Catch ex As Exception
Cursor.Current = Cursors.Default
MessageBox.Show("clicca meglio:" + ex.ToString)
Exit Sub
End Try
Dim f As Form = CType(exFormAsObj, Form)
f.MdiParent = Me
f.Show()
Cursor.Current = Cursors.Default …
Run Code Online (Sandbox Code Playgroud) 我有一个返回旧式ArrayList的第三方方法,我想将其转换为类型化的ArrayList(Of MyType).
Dim udc As ArrayList = ThirdPartyClass.GetValues()
Dim udcT AS List(Of MyType) = ??
Run Code Online (Sandbox Code Playgroud)
我做了一个简单的循环,但必须有一个更好的方法:
Dim udcT As New List(Of MyType)
While udc.GetEnumerator.MoveNext
Dim e As MyType = DirectCast(udc.GetEnumerator.Current, MyType)
udcT.Add(e)
End While
Run Code Online (Sandbox Code Playgroud) 在我的app.config中,我想设置3个跟踪级别(交换机?):详细,警告和无.在代码的调试版本中,我想要在我想要警告的版本中激活详细开关.在特殊情况下,我的应用程序用户可以修改配置文件以禁用所有跟踪.
我希望在控制台上输出调试跟踪,而发布只跟踪到日志文件.
我写了以下内容:
[...]
<system.diagnostics>
<sources>
<!-- This section defines the logging configuration for My.Application.Log -->
<source name="debug" switchName="debug">
<listeners>
<add name="FileLog"/>
<add name="console"/>
</listeners>
</source>
<source name="release" switchName="release">
<listeners>
<add name="FileLog"/>
</listeners>
</source>
<source name="silent" switchName="none">
<listeners/>
</source>
</sources>
<switches>
<add name="debug" value="Verbose"/>
<add name="release" value="Warning"/>
<add name="none" value="Off"/>
</switches>
<!--<sharedListeners>
<add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime" initializeData="felix.log"/>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false" />
</sharedListeners>-->
<trace autoflush="false" indentsize="4">
<listeners>
<add name="FileLog" type="System.Diagnostics.TextWriterTraceListener" traceOutputOptions="DateTime" initializeData="felix.log"/>
<add name="console" type="System.Diagnostics.ConsoleTraceListener" initializeData="false"/>
<remove name="Default"/>
</listeners>
</trace> …
Run Code Online (Sandbox Code Playgroud) 我们开发了一个MFC应用程序,其中主窗口是在DLL中实现的.为了对其进行修改,我们正在考虑将其更改为WPF应用程序,其中"旧"本机窗口在Wpf窗口中被重新托管.到现在为止还挺好.
但是,我们的旧MFC应用程序在应用程序级别捕获了一些消息(例如:防止鼠标单击或键盘输入).要重新托管WPF应用程序中的MFC窗口,我们需要一种方法从WPF应用程序中捕获这些窗口,并要求旧的MFC窗口预翻译它们......
这有可能吗?
我想在HwndHost中重新托管MFC窗口,然后添加一个消息钩子.我的桥接CLR-DLL中的代码看起来像这样(并没有实现我想要的):
MyHwndHost ^handle = gcnew MyHwndHost(pContentWnd);
handle->MessageHook += gcnew HwndSourceHook(&CVSimCoreNat::ControlMsgFilter);
Run Code Online (Sandbox Code Playgroud)
有人可以帮忙吗?
我有几个抽象类是类库,它们想从 Intelisence 中隐藏,怎么做?
我正在开发一个项目,我有几个矩形,我希望每个都有悬停效果.现在我知道我可以捕获WM_MOUSEMOVE消息并遍历每个矩形.但是,如果我有很多矩形(如果50很多),该怎么办?
我可能错了,但不会迭代那么多,并且每次鼠标移动缓慢应用程序一点点时测试每一个?
然后我开始想知道操作系统(例如windows)是如何做到这一点的,现在我的屏幕上有100多个东西,当我将鼠标悬停在它们上面时,它们都有某种动画.而且我不认为每次鼠标移动像素时窗口都会遍历所有窗口.
基本上:
1.如果我有大约50个矩形,我怎么能弄清楚我的鼠标在哪个矩形上面,并考虑到性能.
2. Windows如何做到这一点?(我对任何东西都更好奇,但如果它不复杂,也许我可以在我自己的程序中实现类似的东西?)
哦,它们都是矩形,它们不会旋转或任何东西.