我有一个显示MMS消息列表的DataGridView。为了区分发送和接收,我在一列中放了一个右箭头和左箭头。我们的客户喜欢它,但希望右箭头更加清晰,尤其是在国际环境中。
我使用右箭头并在Visual Studio 2003中打开它(我使用VS2010编写应用程序)。我重新着色了图标,它看起来很棒,但是当我去显示包含Control时,我收到以下错误:
DataGridView中发生以下异常:
System.ArgumentException:参数无效。 at System.Drawing.Image.FromStream(Stream stream,Boolean useEmbeddedColorManagement,Boolean validateImageData) System.Drawing.ImageConverter.convertFrom上的(ITypeDescriptorContext上下文,CultureInfo文化,对象值) at System.Windows.Forms.Formatter.FormatObjectInternal(Object value,Type targetType,TypeConverter sourceConverter,TypeConverter targetConverter,String formatString,IFormatProvider formatInfo,Object formattedNullValue,Object dataSourceNullValue) at System.Windows.Forms.DataGridViewCell.GetFormattedValue(Object value,Int32 rowIndex,DataGridViewCellStyle& cellStyle,TypeConverter valueTypeConverter,TypeConverter formattedValueTypeConverter,DataGridViewDataErrorContexts context)
要替换此默认对话框,请处理DataError事件。
当我创建DataTable以填充数据时,我在具有图标的列上使用它
dt.Columns.Add(sDirection);
dt.Columns[sDirection].DataType = typeof(Byte[]);
当我将数据添加到行时,我有一个转换Icon的方法。
internal static Byte[] ConvertIconToByteArray(Icon pIcon) {
MemoryStream ms = new MemoryStream();
pIcon.Save(ms);
return (ms.GetBuffer());
}
我使用
将DataTable添加到DataGridViewgrdMMSList.DataSource = dt.DefaultView;
(为清晰起见,从上面的代码中删除了方法调用)
我在调试器中进行了跟踪,并将DefaultView设置为DataSource,这是抛出错误的地方。我尝试将它放在try / catch块中,这样我就可以看到Exception,但它不会触发catch。
其他一些信息: - 图标存储为资源,由Properties.Resources.RightArrow调用 - 更改颜色后,我只是在VS2003中保存文件,没有另存为。该文件仍然显示为图标无处不在。 - 回到VS2010,资源文件确实有新的颜色方案并在那里正确渲染。
提前感谢您提供的任何帮助。
答案 0 :(得分:1)
我不会这样编辑图像。如果您想要一组有效的箭头,这些箭头全部支持添加到DataGridView
,那么到目录
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary\1033
在这里你会找到一个.zip文件。解压缩。
然后你会发现带有MS图标和图像等的varios子目录。导航到
C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary\1033
\VS2010ImageLibrary\VS2010ImageLibrary\Objects\png_format\WinVista
在这里,您可以找到所有不同颜色的箭头。我的建议是使用这些,而不是对现有文件进行位图编辑。
我希望这会有所帮助。