Program.cs中的代码
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new Form1());
}
catch (Exception ex)
{
MessageBox.Show("Blah...");
}
}
Run Code Online (Sandbox Code Playgroud)
在Form1中,我有一个带代码的按钮throw new Exception("");.
如果我从Visual Studio运行应用程序,则弹出我的消息框(消息'Blah ...').但是如果我从可执行文件运行应用程序,那么catch块根本不会执行.
为什么不同?
我使用的是Visual Studio 2010,.NET 4.0,Windows XP.
任务:我在装配线的末端安装了一个摄像头,可以捕获生产物品的图像.比如说,我们制作门票(上面有一些文字和图片).因此,每张制作的票都被拍照并保存到磁盘上作为图像.现在我想检查这些保存的图像是否有异常(即将它们与图像(模板)进行比较,这是正常的).因此,如果我们的装配线上的票证有问题(缺少图片,污点......),我的应用程序应该找到它(因为它的图像与我的模板差别太大).
问题:比较图片和找出它们之间的差异最简单的方法是什么?我需要编写自己的方法,还是可以使用现有方法?如果我只设置一个公差值(即图像可以相差1%),将两个图像放在一个函数中并获得返回值true或false,那就太好了:)
工具:C#或VB.NET,Emgu.CV(OpenCV的.NET包装器)或类似的东西
是否有可能为类生成平等成员,该类还包括其基类的成员?
例如 - 抽象基类:
public abstract class MyBaseClass
{
public int Property1;
}
Run Code Online (Sandbox Code Playgroud)
其他课程:
public class MyOtherClass: MyBaseClass
{
public int Property2 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用Resharper自动生成相等成员,我只能基于MyOtherClass.Property2属性获得相等,而不是基于Property1其基类.
首先抱歉这个问题很长,但我写的不能更短:)
现实世界的例子:我们有大卷纸,上面印有小"贴纸".每个贴纸都有一个代码.代码的前两个字母告诉我们这是什么样的贴纸(代表新卷的贴纸,代表当前卷的末端的贴纸,应该进行质量控制的贴纸,......但是大多数是正常的枚举贴纸) .
例如,代码为XX0001的贴纸意味着,在它之后应该只有正常的枚举代码(如NN0001到NN9999),总是相同的数字.代码QC0001告诉我们,接下来的10个代码(从QC0001到QC0010)应该进行质量控制.
我设计的应用程序,这样,每种类型的标签是它自己的类- ,NormalSticker,,BadSticker ,...他们都从SticerBase类,其中包含了一些常用的数据为所有这些(扫描,日期和时间的质量继承扫描,代码内容).这些类的实例是在静态Parser类中创建的,该类检查代码并将适当的对象返回给我们.ControllStickerQualitySticker
一切正常,但现在我停了下来.我还有一个Roll类,它有一组贴纸,实现为List<StickerBase>.这个类有一个公共AddSticker(StickerBase)方法,我们用它来添加贴纸.但是这个方法应该包含一些逻辑,例如,如果我们得到代码XX001,那么下一个9999贴纸应该是从NN0001到NN9999.我在这里看到的唯一选择是根据贴纸的类型做出决定,例如:
public void AddSticker(StickerBase sticker)
{
if (sticker.GetType().Equals(typeof(StickerNewRoll)))
{
// Next 9999 sticker should be in the form of NN0001 to NN9999
}
if (sticker.GetType().Equals(typeof(EnumeratedSticker)))
{
// Add 9999 stickers to the list, other business logic...
}
if (sticker.GetType().Equals(typeof(QualitySticker)))
{
// Stop the machine and notify the worker
}
}
Run Code Online (Sandbox Code Playgroud)
如果这是正确的方法,我会感到非常惊讶.有任何想法吗?
编辑 - 可能的解决方案:因为对于每个贴纸,我知道下一个贴纸的样子,我可以public Sticker NextStickerShouldLookLike()为每个Sticker类添加新的方法.在验证逻辑中(类似于PéterTörök的回答)我可以检查当前贴纸是否与之相同 …
我正在尝试侦听COM端口,以便为SerialPort.DataReceived事件创建新的处理程序.逻辑很简单 - 我写了一些东西给TextBox1,按下Button1,我的文本应该在Label1中显示它自己.但我的应用程序不想运行,因为它抛出"交叉线程操作无效"错误.我做了一些搜索并找到了Invoke对象 - 我如何在我的例子中使用它?为什么我需要包含Invoke逻辑?
namespace WindowsApplication1
{
public partial class Form1 : Form
{
SerialPort sp = new SerialPort();
public Form1()
{
InitializeComponent();
sp.DataReceived += MyDataReceivedHandler;
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void MyDataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
try
{
//sp.PortName = "COM3";
//sp.Open();
Label1.Text = sp.ReadLine();
}
catch (Exception exception)
{
RichTextBox1.Text = exception.Message + "\n\n" + exception.Data;
}
finally
{
sp.Close();
}
}
private void button1_Click(object sender, EventArgs e)
{ …Run Code Online (Sandbox Code Playgroud) 我有一个枚举,其中:
现在我想在此DropBox中添加"All"(或"None")值.
我该怎么做:
解决方案设置
假设我有一个Customer实体,它是:
BLL和DAL应该用什么类型的对象进行通信 - DataTable或者List<Customer>(例如)?在第一种情况下,BLL逻辑应将Customer对象转换为DataTable并将其发送到DAL.在secod的情况下,DAL层应该知道Customer层,它位于BLL层中.但原始DLL引用DAL而不是相反......
我是否应该将所有类放入单独的程序集中,这是由所有其他类引用的(Common,BusinessObjects,...)?在这种情况下,我可以在所有项目中使用Customer类.
我知道,当我知道只有一个BLL会使用我的DAL时,我是否应该费心去分离DAL和BLL.在这种情况下,我可以将它们合并为一个项目.
PS - 我正在阅读关于DataTables的内容,很多人说我们根本不应该使用它们.有什么更好的选择?也许现在是我学习一些ORM映射工具的时候了:)
我的桌子:
create table MyTable (
Id int identity(1,1) not null,
MyStatus char(2) not null
)
insert into MyTable(MyStatus) select 'A'
Run Code Online (Sandbox Code Playgroud)
类和枚举:
public class MyTable
{
public virtual int Id { get; set; }
public virtual MyTableStatus MyStatus { get; set; }
}
public enum MyTableStatus
{
A,
B
}
Run Code Online (Sandbox Code Playgroud)
制图:
public MyTableMap()
{
Id(x => x.Id);
Map(x => x.MyStatus);
}
Run Code Online (Sandbox Code Playgroud)
当我执行以下测试时,我得到System.FormatException:输入字符串的格式不正确...
[Test]
public void Blah()
{
MyTable myTable = Session.Get<MyTable>(1);
Assert.That(myTable.MyStatus, Is.EqualTo(MyTableStatus.A));
}
Run Code Online (Sandbox Code Playgroud)
将枚举映射到数据库中的字符串表示形式的正确方法是什么?
编辑 - 我在现有数据库上编写应用程序,我无法轻易修改,因为它也被其他应用程序使用.所以数据库中的一些字段(我想在我的应用程序中表示为枚举)是int类型和一些char(2)类型.
我的桌子:
TableA (id number, state number)
TableB (id number, tableAId number, state number)
TableC (id number, tableBId number, state number)
Run Code Online (Sandbox Code Playgroud)
因此TableC中的项是TableB的子项,TableB中的项是TableA的子项.反之亦然 - TableA中的项是TableB的父项,TableB中的项是TableC的父项.
我想控制父项的状态......比方说,我们有这些数据:
TableA (id, state):
1, 40
TableB (id, tableAId, state):
1, 1, 40
2, 1, 60
TableC (id, tableBId, state):
1, 1, 40
2, 1, 50
3, 2, 60
4, 2, 70
Run Code Online (Sandbox Code Playgroud)
父母国家应该始终保持他孩子最小的状态.所以如果我们现在像这样更新TableC:
update TableC set state = 50 where Id = 1;
Run Code Online (Sandbox Code Playgroud)
我的触发器应该自动更新TableB(设置状态= 50,其中id = 1),然后更新TableA(设置状态= 50,其中id = 1)
我想用触发器(在表A,表B,表C上进行更新,插入,删除之后)执行此操作,以便在执行每个操作后执行以下步骤:
如何避免"改变表错误"?在此示例中是否可以节省使用自治事务?我看到一些意见,变异表错误表明应用程序的逻辑存在缺陷 - 这是真的吗?如何更改我的逻辑以防止此错误? …
假设我们有这样的数据结构:
var sequences = new List<Tuple<int, int>>
{
new Tuple<int, int>(1, 10),
new Tuple<int, int>(8, 101),
new Tuple<int, int>(102, 103),
new Tuple<int, int>(104, 104),
new Tuple<int, int>(110, 200)
};
Run Code Online (Sandbox Code Playgroud)
我想从这个集合中得到两个结果:
我可以编写一个带有几个循环和辅助集合的算法.这个过程是可行的,但我想知道这是否可以在LINQ和/或其他更简单和更短的算法的帮助下实现?
编辑:我上面例子的数据结构代表5个序列,第一个包含从1到10的数字,第二个包含从8到101的数字等等...因为在生产中序列可以更大(高达数百万),它们不用实际集合表示(例如带有所有数字的列表),而是用元组表示,它代表每个序列的最小和最大数量.