存档在 ‘C#’ 分类

DataGridView绑定Ilist对象,出现IndexOutOfRangeException错误的解决方法

2017年10月24日

我是这样绑定DataGridVeiw的:

IList<Resource> resources = new List<Resource>();
Resource  resource = new Resource();
resources.Add(resource);
dataGridView.DataSource = resources;

在第一个模块中能正常使用,没有任何问题。但到了第二个模块,同样的语句,只要一点击DataGridView控件,马上就会跳出System.IndexOutOfRangeException异常,具体内容如下:

未处理 System.IndexOutOfRangeException
  Message="索引 -1 没有值。"
  Source="System.Windows.Forms"
  StackTrace:
       在 System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
       在 System.Windows.Forms.CurrencyManager.get_Current()
       在 System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
       在 System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
       在 System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
       在 System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown)
       在 System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
       在 System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
       在 System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
       在 System.Windows.Forms.Control.WndProc(Message& m)
       在 System.Windows.Forms.DataGridView.WndProc(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       在 System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       在 System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       在 System.Windows.Forms.Application.Run(Form mainForm)
       在 KoalaStudio.ksRBAC.PrivilegeConfigTool.Program.Main()
       在 System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       在 System.Threading.ThreadHelper.ThreadStart()

而且比较可恶的是,抛出异常的地方竟然是在Program.cs里,指向

Application.Run(new FrmMain());

这让人怎么调试,试了N回,也没发现原因。
于是上网找了找,竟然真有解决的方法,其作者也并未解决这个问题,而是采取了折衷的方法,用了一个过渡组件来解决:

BindingSource bindingSource = new BindingSource();
bindingSource.DataSource = resources;
dgvResource.DataSource = bindingSource;

问题可以解决,但又有了新的问题,因为使用了BindingSource,因此对与DataGridView的更改并不能同步到Ilist对象上,所以还是不能用这种方法,继续研究。

上国外的网站看了看,终于找到了问题的原因,在向DataGridView绑定Ilist类型的对象是,如果对象的成员为0,那么就会出现
此问题。而且即使重新绑定DataGridView的数据源,也会继续存在此问题,解决的方法就是在向DataGridView绑定Ilist对象是,要保证其中至少有一个成员,否则宁可不绑定(虽然不是最完美的解决方法)。
其实最好的方法,是用BindingList对象代替Ilist对象作为DataGridView的数据源,即可彻底解决此问题,而且能实现DataGridView修改时与数据源的自动更新。但现在没有时间,只能先这样用了。

C#如何把一个对象的实例保存在文件中

2017年9月2日

把对象保存在文件中(格式为二进制文件):

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(@"D:\MyObj.bin", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
MyObj myObj = new MyObj();
//To Do: 在这里对myObj的属性进行设置
formatter.Serialize(stream, myObj);
stream.Close();

从文件还原对象:

IFormatter formatter = new BinaryFormatter();
Stream stream = new FileStream(@"D:/MyObj.bin", FileMode.Open,FileAccess.Read, FileShare.None);
MyObj myObj = (MyObj)formatter.Deserialize(stream);
stream.Close();

VS 用户自定义控件未出现在工具箱的解决方案

2017年7月27日

在项目中增加几个用户自定义控件,想及时在窗口Form上添加时却发现工具箱根本就没有这些用户自定义控件,研究了很久,发现有两个解决办法。通过以下两种方法操作后,再重新编译,在工具箱上就会出现用户自定义控件了,项目中所有的自定义控件都会及时显示到工具箱上。
【1】工具=》选项=》Windows窗体设计器=》常规=》AutoToolBoxPopulate=》True

12

【2】项目=》刷新项目工具箱

3

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

2017年3月21日

在C#开发的过程中多线程委托是经常用的,今天在测试以前写的软件的时候发现有个问题,报 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。 这样的错误。
仔细检查,是在调用一个委托的时候出来的,有时候还会把软件都关闭掉。这个问题很严重,当然这样是我不是正常操作的时候才会产生的,也就是之前没注意到的问题。

在调用下一个委托的时候。先判断下 在控件上面或者窗体上 IsHandleCreated ,如下:
if (this.IsHandleCreated)
{
Methinvoker meth = new Methinvoker(MessSeInfo);

this.BeginInvoke(meth);
}
这样就可以避免了,而且说有时候就关掉软件就是应为线程在执行的时候还没有关闭掉就直接赋值为Null了。 把这个去掉就好了

未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包

2017年3月21日

—————————
Microsoft Visual Studio
—————————
未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包。

此问题可能是由配置更改或安装另一个扩展导致的。可以通过查看文件“C:\Users\用户名\AppData\Roaming\Microsoft\VisualStudio\11.0\ActivityLog.xml”来获取详细信息。

解决方案:”Microsoft Visual Studio 2012″->”Visual Studio Tools”->”VS2012 开发人员命令提示”->输入”devenv /resetuserdata ”

ava中byte[]转String问题

2017年3月8日

最近的项目中要使用到把byte[]类型转换成String字符串然后发送,但发现发现出去的字符串和获取的字符串虽然是一样的,但当用String的getBytes()的方法得到的byte[]跟原来的byte[]是不一样的。
看如下代码:
bytebytes[] = new byte[] { 50, 0, -1, 28, -24 };
String string = new String(bytes);
byte[] ret = string.getBytes();
查看ret的数据发现是50, 0, -17, -65, -67, 28, -17, -65, -67,发现数据并不是原来的数据。

而使用如下代码就可以得到原来的数据:

byte bytes[] = new byte[] { 50, 0, -1, 28, -24 };
StringisoString = new String(bytes, "ISO-8859-1");
byte[] isoret = isoString.getBytes("ISO-8859-1");

这是为什么呢? 原因是第一种方法默认是用UTF-8编码来生成String的 ,用System.getProperty(“sun.jnu.encoding”)可以得到Android默认编码是UTF-8。UTF-8是可变长度的编码,原来的字节数组就被改变了。而ISO8859-1通常叫做Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中 0~127的字符与ASCII码相同,它是单字节的编码方式,这样第二种方式生成的String里的字节数组就跟原来的字节数组一样。在new String使用其他编码如GBK,GB2312的话一样也会导致字节数组发生变化,因此要想获取String里单字节数组,就应该使用iso-8859-1编码。

C# 委托实例(跨窗体操作控件)

2017年1月23日

在C#里面却是可以不用自定义消息这么复杂的方法来实现跨窗体调用控件,C#有更好的办法就是委托。
效果描述:有两个窗体,FORM1(一个名为“打开form2”的button控件)和FORM2(一个名为“改变form1颜色“的button控件)。启动时,FORM1中点击button控件“打开form2””使FORM2显示出来。点击FORM2中的“改变form1颜色”后,Form1中颜色改变。

一、在Form2里面:
首先声明一个委托和委托实例
Form2类外

public delegate void ChangeFormColor(bool topmost);  

Form2类里

public event ChangeFormColor ChangeColor; 

Form2的按钮事件中调用委托

rivate void button1_Click(object sender, EventArgs e)  
        {  
            ChangeColor(true);//执行委托实例  
        }  

二、在Form1里面:
button控件“打开form2“的click事件中有下面的代码:

{  
    Form2 f = new Form2();  
    f.ChangeColor += new ChangeFormColor(f_ChangeColor);  
    f.Show();  
}  

f.ChangeColor += new ChangeFormColor(f_ChangeColor);
这句最关键,你输入到+=之后,按两下Tab,他会自动给你生成回调函数,如下:

void f_ChangeColor(bool topmost)  
        {  
            this.BackColor = Color.LightBlue;  
            this.Text = "改变成功";  
        }  

三、完整代码

using System;
using System.Drawing;
using System.Windows.Forms;

namespace 跨窗体调用控件
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.ChangeColor += new ChangeFormColor(f_ChangeColor);
            f.Show();
        }
        void f_ChangeColor(bool topmost)
        {
            this.BackColor = Color.LightBlue;
            this.Text = "改变成功";
        }
    }
}
using System;
using System.Windows.Forms;

namespace 跨窗体调用控件
{
    public delegate void ChangeFormColor(bool topmost);
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }
        public event ChangeFormColor ChangeColor;
        private void button1_Click(object sender, EventArgs e)
        {
            ChangeColor(true);//执行委托实例
        }
    }
}

先进的权限模型体系设计

2016年10月30日

目前权限管理系统不少,但通用、灵活、符合现代企事业单位实际工作需要的不多。现有的权限系统绝大多数都是以模块为核心,而本权限模型将摒弃此类普遍的做法,将以组织机构为核心来进行权限系统的设计,因为这更符合实际的业务需求

附 – 权限模型+流程专家:http://pjdemo.yellbuy.com/

    附 – 代码工厂 MVC 插件 Demo 地址:http://mvcdemo.yellbuy.com/

    附 – 代码工厂 WPF 插件 介绍:http://www.cnblogs.com/gyche/archive/2012/06/02/2531121.html

    附件下载一 – 代码工厂:YbSoftwareFactory V2 下载,运行环境-.NET 4.0。

    附件下载二 – 代码工厂 WinForm 插件 Demo:YbRapidSolution for WinForm Demo下载:运行环境-.NET 4.0。服务层部署在 Internet 上,,可直接运行;如需在本地部署,除了安装数据库外,就是修改配置文件,这里不再详述。