我目前正在开发一个应用程序,我想在上下文菜单中显示UserControl.我能够(使用ToolStripControlHost实现这一点).显示在(NumericUpDownToolStripItem代码)中:下面是对象的代码(用VC++.net 2.0编写).注意:在这方面存在半类似的SO问题,但似乎没有一个问题涉及序列化用户控件,只是处理用户控件中的标准对象.
在对象后面显示的是实际usercontrol的代码,它是带有标签的usercontrol和numericupdown控件.
问题:当我为我的应用程序加载设计器时,我可以添加我的NumericUpDownToolStripItem就好了,但是,当我打开使用外露属性来编辑我的usercontrol时,没有任何数据被序列化到我的NumericUpDownToolStripItem对象的InitializeComponent方法中.这样做的结果是我的控件加载与运行时的所有默认值.每次我重新加载表单时,修改都会丢失.
我已经使用位于TypeConverter的教程尝试在MSDN上,但它并没有正常工作.一切都编译得很好,除了我的对象在设计网格中变得完全灰暗(只是访问者属性,而不是整个menupic).我注意到的另一个问题是这个方法并不是专为UserControls设计的,它可能有几个不同的可修改属性,并且每个都不可能有重载.
所以,我有以下问题:
提前致谢.我将继续研究这个并保持更新的问题.
NumericUpDownToolStripItem Class:
[ToolStripItemDesignerAvailability(ToolStripItemDesignerAvailability::All)]
public ref class NumericUpDownToolStripItem : public ToolStripControlHost
{
public:
[DesignerSerializationVisibility(DesignerSerializationVisibility::Content |
DesignerSerializationVisibility::Visible)]
property LabeledNumericUpDown ^LabeledNumericUpDownControl
{
LabeledNumericUpDown ^get() { return (LabeledNumericUpDown^)this->Control; }
}
public: NumericUpDownToolStripItem(void) :
ToolStripControlHost(gcnew LabeledNumericUpDown()) {}
protected: void OnSubscribeControlEvents(Control ^control) new { //irrelevant to question }
protected: void OnUnsubscribeControlEvents(Control ^control) new { //irrelevant to question }
};
public ref class LabeledNumericUpDown : public UserControl
{
public: [ DesignerSerializationVisibility(DesignerSerializationVisibility::Content |
DesignerSerializationVisibility::Visible)]
property String …Run Code Online (Sandbox Code Playgroud) 我遇到了以下问题:我有一个带有约束的泛型类,它派生自非泛型接口:
public abstract class DrilldownBase<W> where W : class, IDrilldown
Run Code Online (Sandbox Code Playgroud)
这段代码不正确,因为它认为IDrilldown是一个约束,当它的NOT.我想要的是DrilldownBase类从IDrilldown继承.我错过了什么?
谢谢.
我正在使用Microsoft Chart Controls(4.0),并且有一个包含多种标记类型的折线图.这么多,我已经没有市场营销了.默认值(方形,三角形,圆形等)不足.
是否可以添加自定义标记类型图像?例如,我需要一个指向相反方向的三角形.
希望我能正确地问我的问题。我在尝试序列化特定对象时遇到以下异常(我熟悉使用标准 [Serialized] 属性)
mscorlib.dll 中发生了“System.Runtime.Serialization.SerializationException”类型的第一次机会异常
其他信息:程序集“System,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”中的类型“System.ComponentModel.Component”未标记为可序列化。
我找不到这到底是从哪里来的。我的类都没有继承自 Component,它们的基类都没有继承自组件。
我已经到了将每个委托\成员变量标记为 [NonSerialized] 的地步,并且每次我尝试序列化时它仍然抛出此异常。
所以我的问题是:我可以使用这个 PublicKeyToken,并找到正在尝试序列化的确切类\成员吗?
我有以下两行代码:
var BadResult = (100).ToString("B", new CustomFormatter ());
var GoodResult = String.Format("{0}", 100, new CustomFormatter ());
Run Code Online (Sandbox Code Playgroud)
然而,BadResult显然很糟糕,GoodResult很好.我的CustomFormatter类声明如下:(同样,我认为一个函数是相关的):
public class CustomFormatter
: IFormatProvider, ICustomFormatter
{
public virtual Object GetFormat(Type formatType)
{
String formatTypeName = formatType.ToString();
formatTypeName = formatTypeName;
Object formatter = null;
if (formatType == typeof(ICustomFormatter))
formatter = this;
return formatter;
}
}
Run Code Online (Sandbox Code Playgroud)
问题本身,当我运行具有"良好结果"的代码行时,GetFormat函数是requestng一个CustomFormatter的实例.
每当用Float.Tostring()调用它时,它期望一个NumberFormatInfo的实例.
我最初跳到"我的CustomFormatter应该从NumberFormatInfo派生".不幸的是,课程是密封的.
那么: 我需要做什么才能用自定义格式化程序调用Float.ToString()?
谢谢!
Late Edit 我将此标记为C#问题以及C++,因为问题出现在两种语言中,如果显示的解决方案很可能是在C#(市场的大部分)中.
我一直在.net 2.0下开发一个应用程序(C++具体,但不相关).
此应用程序使用自定义派生的datagridview.此数据网格视图偶尔会出现关于不包含单元格的DGV区域以及滚动条的严重伪像问题. 在一些调整大小的操作,一个黑色的矩形会在DataGridView,这将在作用限制网格的尺寸的底部绘制. 滚动条也缩小以适应非坚固区域.在我看来,因为系统认为DGV尺寸错误,并且正在进入错误的区域.
alt text http://img12.imageshack.us/img12/2213/81356991.jpg
我只能通过两种方法来修复症状:
1.单击要调整大小的列将自动修复网格
2.在DGV中调用AutoResizeRows()函数将执行修复(但我相信是从第1点).
对自定义DGV的一些修改:
1)配置为处理多行的拖放.
2)点1要求重写OnCellPainting以绘制拖动线.如果看起来有症状,可以发布功能.
3)问题总是发生在一个调整大小(手动和自动两种可能会导致问题),但在调整大小事件没有自定义代码.
onCellPainting的后期编辑代码.在gridview中重写的其他函数:OnMouseDown,OnCellMouseDown,OnClick,OnMouseMove,OnDragOver,OnDragDrop,OnDragLeave,OnKeyDown,其中任何一个看起来都没有症状
protected: [DebuggerStepThrough()]
virtual System::Void OnCellPainting(DataGridViewCellPaintingEventArgs ^e) override
{
//draws red drag/drop target indicator lines if necessary
if (this->AllowDrop && _DragDropCurrentIndex > -1 && ShowDragLines)
{
System::Drawing::Pen ^p = gcnew Pen(System::Drawing::Color::Navy, 3);
//row drag/drop
if (e->RowIndex == _DragDropCurrentIndex &&
_DragDropCurrentIndex <= this->RowCount)
{
//if this cell is in the same row as the mouse cursor
e->Graphics->DrawLine(
p,
e->CellBounds.Left, …Run Code Online (Sandbox Code Playgroud) 我有一个企业应用程序,可以在发生任何事件时记录异常信息.该应用程序是C#和C++ .net的组合.
我想在异常时获得尽可能多的信息.截至目前,我们只打印出Message和堆栈跟踪(在调试版本中提供行号,但不释放).
任何错误日志的目标都是尽可能地指出错误(尽可能接近).我很好奇我怎么能走得更远?我想要更多信息.
作为一个例子,我知道NullReferenceExceptions和InvalidArguementExceptions包含不同数量的信息,但我没有利用除"消息"字段之外的任何东西.
我最好的选择是使用反射并捕获所有公共成员并打印出来吗?或者可能链式TONS进行类型检查和转换,以便干净地打印出来?作为约束,我的日志记录功能只需要接受Exception类型的参数.
我有一个属性,(如下所示).
[DefaultValue(false)]
public bool MyProperty {
get {
return myVal;
}
set {
myVal=value;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用它的情况是确保它在PropertyGrid中显示为粗体,如果未设置默认值.
我觉得令人难以置信的是,在我的构造函数中,我必须设置我的属性的初始值,并希望它们匹配.
是否可以让我的构造函数"发现"给定属性的默认值,并相应地设置它?就像是:
myctor()
{
myVal = GetDefaultValueProperty<bool>("MyProperty");
}
Run Code Online (Sandbox Code Playgroud) 我的任务是解决以下问题:当调用PrintDlg()函数时,我的应用程序在64位机器上运行时崩溃.
在挖掘和拔毛之后,我决定最好的解决方案是用其更大的兄弟PrintDlgEx()替换PrintDlg()的原始调用.
这样做可以解决一个问题(它不再崩溃!),但会导致另一个问题.当我执行代码时,它不会显示打印对话框,只返回成功代码,并为我提供默认打印机的所有信息.我需要这个功能来显示标准的"打印设置"窗口,我不知道如何实现它.下面显示的是我试图用来显示对话框的示例值.
有什么想法吗?提前致谢.
// Initialize the PRINTDLGEX structure.
pd2.lStructSize = sizeof(PRINTDLGEX);
pd2.hwndOwner = wnddata->wnd.hnd;
pd2.hDevMode = NULL;
pd2.hDevNames = NULL;
pd2.hDC = NULL;
pd2.Flags = PD_RETURNDC | PD_COLLATE;
pd2.Flags2 = 0;
pd2.ExclusionFlags = 0;
pd2.nPageRanges = 0;
pd2.nMaxPageRanges = 10;
pd2.lpPageRanges = NULL;
pd2.nMinPage = 1;
pd2.nMaxPage = 1000;
pd2.nCopies = 1;
pd2.hInstance = 0;
pd2.lpPrintTemplateName = NULL;
pd2.lpCallback = NULL;
pd2.nPropertyPages = 0;
pd2.lphPropertyPages = NULL;
pd2.nStartPage = START_PAGE_GENERAL;
pd2.dwResultAction = 0; …Run Code Online (Sandbox Code Playgroud) 我正在设计格式化日期时间以显示在图表上,并且它到目前为止工作得很好.我有格式字符串:
M/dd/yyyy HH:mm:ss
除了以下内容之外我会按照我的喜好进行打印:如果时间是午夜,我想完全隐藏HH:mm:ss.
是否可以不使用自定义iformatprovider?
谢谢!
我有一个简单的界面,定义如下:
interface iFace
{
int Value { get; }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,任何实现iFace的类都必须具有名为Value的类型为int的属性.这个接口的用法将是数据绑定,我不关心属性是什么类型.我有什么选择吗?我想避免这个解决方案:
interface iFace<T>
{
T Value { get; }
}
Run Code Online (Sandbox Code Playgroud)
因为我想在不指定类型的情况下引用接口
编辑:
我希望能够将相同的界面应用于NumericUpDown控件和Trackbar控件.一个的value属性是decimal类型,另一个是int类型.
在这种情况下,将属性设置为object类型将不起作用.
c# ×10
.net ×9
formatting ×2
generics ×2
reflection ×2
winforms ×2
assemblies ×1
attributes ×1
c ×1
charts ×1
constraints ×1
datagridview ×1
datetime ×1
exception ×1
interface ×1
logging ×1
printdialog ×1
printing ×1
types ×1
visual-c++ ×1
win32com ×1
winapi ×1