मैं एक वर्ग के साथ एक संपत्ति ग्रिड नियंत्रण को शामिल करने की कोशिश कर रहा हूं जिसमें गुणों में से एक के रूप में किसी अन्य वर्ग की सूची/संग्रह है। आइए उन्हें कक्षा ए कहते हैं और सूची में संदर्भ के लिए कक्षा बी होगी।
मैं एक ऐसे फॉर्म को शामिल करना चाहता था जिसमें दो सूची बॉक्स हों। बाईं ओर सूची बॉक्स में मेरे प्रोग्राम में सभी वर्ग बी की सूची होगी जो वर्तमान में दाईं ओर सूची में नहीं हैं। दाईं ओर की सूची में सभी वर्ग B होंगे जो वर्तमान में कक्षा A से संबद्ध हैं। मुझे दो सूचियों के बीच आइटम को स्थानांतरित करने के लिए बीच में बटन चाहिए।
यह डिजाइन करना आसान होगा, लेकिन मुझे यकीन नहीं है कि संग्रह संपादक के रूप में उपयोग किए जाने वाले फॉर्म को कैसे सेट अप किया जाए।
क्या कोई मुझे सही दिशा दिखा सकता है?
और साथ ही, मैं उस संपत्ति के लिए ड्रॉप डाउन सेट अप करने के बारे में कैसे जा सकता हूं जिसमें आईडी की एक सूची शामिल है, जिसमें से कोई भी मुझे इसे पूरा करने की दिशा में इंगित कर सकता है।
2 जवाब
ठीक है, मैं अंत में यह ट्रैक करने में सक्षम था कि इसे कैसे पूरा किया जाए।
मैं एक कस्टम CollectionEditor.CollectionForm
बनाने का प्रयास कर रहा था जो मुझे करने की आवश्यकता के करीब था, लेकिन यह बिल्कुल सही दिशा नहीं थी।
सबसे पहले, एक नियमित विंडोज फॉर्म बनाएं जिसमें आपके संग्रह को संपादित करने के लिए आपका जीयूआई शामिल हो। फिर बस बटन/बटन शामिल करें जो फॉर्म में डायलॉग रिसेट लौटाते हैं।
अब जो मैं खोज रहा था उसे पूरा करने की कुंजी CollectionEditor.CollectionForm
नहीं है जैसा कि मैंने सोचा था कि यह सही दृष्टिकोण होगा, बल्कि एक UITypeEditor
होगा।
इसलिए, मैंने एक वर्ग बनाया जो UITypeEditor से विरासत में मिला। फिर आप इसे इस तरह से मांस देते हैं:
public class CustomCollectionModalEditor: UITypeEditor
{
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
{
if (context ==null || context.Instance == null)
return base.GetEditStyle(context);
return UITypeEditorEditStyle.Modal;
}
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
{
IWindowsFormsEditorService editorService;
if (context == null || context.Instance == null || provider == null)
return value;
editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
CForm CollectionEditor = new CForm();
if (editorService.ShowDialog(CollectionEditor) == System.Windows.Forms.DialogResult.OK)
return CollectionEditor.Programmed;
return value;
//return base.EditValue(context, provider, value);
}
}
ध्यान देने योग्य प्रमुख भाग GetEditStyle
और EditValue
हैं। अपने संग्रह को संपादित करने के लिए आपके द्वारा बनाए गए फॉर्म को बंद करने के लिए जिम्मेदार हिस्सा EditValue
ओवरराइड फ़ंक्शन में है।
CForm
कस्टम संग्रह संपादक फ़ॉर्म है जिसे मैंने इस परीक्षण में संग्रह को संपादित करने के लिए डिज़ाइन किया है। आपको संग्रह को संपादित करने के लिए डिज़ाइन किए गए फॉर्म को दिखाने के लिए IServiceProvider
से जुड़े IWindowsFormsEditorService
को लाने की जरूरत है और IWindowsFormsEditorService
के .ShowDialog(formVariable)
को कॉल करें। फिर आप अपने फ़ॉर्म से catch
लौटाया गया DialogResult
मान कर सकते हैं और कोई भी कस्टम हैंडलिंग कर सकते हैं जिसकी आपको आवश्यकता है।
मुझे उम्मीद है कि यह किसी की मदद करता है क्योंकि इसे शामिल करने का सही तरीका निर्धारित करने में मुझे काफी खुदाई करनी पड़ी।
यह ब्रैंडन के सवाल का जवाब देता है। मैंने भी डिफ़ॉल्ट प्रॉपर्टीग्रिड संग्रह संपादक को वास्तव में प्रतिस्थापित करने के तरीके पर लंबी और कड़ी खोज की। नाथन का उत्तर अंतिम समाधान था। ब्रैंडन यहां बताया गया है कि मैं नाथन के समाधान का उपयोग करने और अपने स्वयं के संग्रह संपादक का उपयोग करने में सक्षम था।
using Swfd = System.Windows.Forms.Design;
using Scm = System.ComponentModel;
using Sdd = System.Drawing.Design;
public class CustomCollectionModalEditor : Sdd.UITypeEditor
{
public override Sdd.UITypeEditorEditStyle GetEditStyle(Scm.ITypeDescriptorContext context)
{
if (context == null || context.Instance == null)
return base.GetEditStyle(context);
return Sdd.UITypeEditorEditStyle.Modal;
}
public override object EditValue(Scm.ITypeDescriptorContext context, IServiceProvider provider, object value)
{
Swfd.IWindowsFormsEditorService editorService;
if (context == null || context.Instance == null || provider == null)
return value;
editorService = (Swfd.IWindowsFormsEditorService)provider.GetService(typeof(Swfd.IWindowsFormsEditorService));
//CForm CollectionEditor = new CForm();
//--- Replaced the Collection from this post with mine which requires an argument that passes the collection
Ccne.CustomCollection editgcp = new Ccne.CustomCollection(); // Ccne.CustomCollection is my collection
editgcp = MYGCPS; // MYGCPS is the actual instance to be edited
Gcp_Editor.GcpEditorMain CollectionEditor = new Gcp_Editor.GcpEditorMain(editgcp); // call my editor
if (editorService.ShowDialog(CollectionEditor) == System.Windows.Forms.DialogResult.OK)
{
MYGCPS = CollectionEditor.ReturnValue1; // update current instance of the collection with the returned edited collection
THISPG.Refresh(); // calls a method which refreshes the property grid
return value; // the replaces the statment in the post >> CollectionEditor.Programmed;
}
//---
return value;
//return base.EditValue(context, provider, value);
}
}
//---------- The propertygrid entry
private Ccne.CustomCollection gCPs;
[Scm.Category("3 - Optional inputs to run gdal_translate")]
[PropertyOrder(133)]
[Scm.TypeConverter(typeof(Ccne.CustomCollectionConverter))]
[Scm.Editor(typeof(CustomCollectionModalEditor), typeof(Sdd.UITypeEditor))]
[Scm.Description("The Collection of the single or multiple Ground Control Points (Gcp)" +
" entered. \n Each gcp requires a Name, pixel, line, easting, " +
"northing, and optionally an elevation")]
[Scm.RefreshProperties(Scm.RefreshProperties.All)] // http://stackoverflow.com/questions/3120496/updating-a-propertygrid
[Scm.DisplayName("23 Collection of Gcp's")]
[Scm.ReadOnly(true)] // prevents values being changed without validation provided by form
public Ccne.CustomCollection GCPs
{
get { return gCPs; }
set { gCPs = value; }
}
//-------- important code from CollectionEditor i.e. > Gcp_Editor.GcpEditorMain(editgcp)
using Swf = System.Windows.Forms;
namespace Gcp_Editor
{
public partial class GcpEditorMain : Swf.Form
{
public Ccne.CustomCollection ReturnValue1 { get; set; }
...
public GcpEditorMain(Ccne.CustomCollection input1)
{
InitializeComponent();
formcollection = input1;
}
...
private void OkayBtn_Click(object sender, EventArgs e)
{
this.DialogResult = Swf.DialogResult.OK;
ReturnValue1 = formcollection;
return;
}
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।