मैं एक वर्ग के साथ एक संपत्ति ग्रिड नियंत्रण को शामिल करने की कोशिश कर रहा हूं जिसमें गुणों में से एक के रूप में किसी अन्य वर्ग की सूची/संग्रह है। आइए उन्हें कक्षा ए कहते हैं और सूची में संदर्भ के लिए कक्षा बी होगी।

मैं एक ऐसे फॉर्म को शामिल करना चाहता था जिसमें दो सूची बॉक्स हों। बाईं ओर सूची बॉक्स में मेरे प्रोग्राम में सभी वर्ग बी की सूची होगी जो वर्तमान में दाईं ओर सूची में नहीं हैं। दाईं ओर की सूची में सभी वर्ग B होंगे जो वर्तमान में कक्षा A से संबद्ध हैं। मुझे दो सूचियों के बीच आइटम को स्थानांतरित करने के लिए बीच में बटन चाहिए।

यह डिजाइन करना आसान होगा, लेकिन मुझे यकीन नहीं है कि संग्रह संपादक के रूप में उपयोग किए जाने वाले फॉर्म को कैसे सेट अप किया जाए।

क्या कोई मुझे सही दिशा दिखा सकता है?

और साथ ही, मैं उस संपत्ति के लिए ड्रॉप डाउन सेट अप करने के बारे में कैसे जा सकता हूं जिसमें आईडी की एक सूची शामिल है, जिसमें से कोई भी मुझे इसे पूरा करने की दिशा में इंगित कर सकता है।

8
Nathan Raley 23 सितंबर 2011, 17:54
किसी भी विचार को संग्रह संपादक फॉर्म के रूप में फ़ॉर्म कैसे सेट करें?
 – 
Nathan Raley
26 सितंबर 2011, 22:18

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 मान कर सकते हैं और कोई भी कस्टम हैंडलिंग कर सकते हैं जिसकी आपको आवश्यकता है।

मुझे उम्मीद है कि यह किसी की मदद करता है क्योंकि इसे शामिल करने का सही तरीका निर्धारित करने में मुझे काफी खुदाई करनी पड़ी।

17
Ganesh Kamath - 'Code Frenzy' 30 मार्च 2017, 11:14
4
15 महीने बाद, मुझे आपका यहाँ का प्रयास बहुत उपयोगी लगा। धन्यवाद!
 – 
Christopher Berman
12 पद 2012, 03:03
यह एक त्वरित और गंदे खिलौना प्रोजेक्ट के लिए बहुत अच्छा काम करता है जिस पर मैं काम कर रहा था।
 – 
Ani
16 मई 2013, 04:15
ढाई साल बाद और इसने अभी भी मेरी मदद की। हालांकि, मैं अपने मौजूदा संग्रह को बनाए गए फॉर्म में कैसे प्राप्त करूं!
 – 
Brandon
30 अप्रैल 2014, 19:34
अच्छा लग रहा है, इसे कस्टम नियंत्रण में कैसे उपयोग करें?
 – 
GuidoG
5 जिंदा 2021, 16:47

यह ब्रैंडन के सवाल का जवाब देता है। मैंने भी डिफ़ॉल्ट प्रॉपर्टीग्रिड संग्रह संपादक को वास्तव में प्रतिस्थापित करने के तरीके पर लंबी और कड़ी खोज की। नाथन का उत्तर अंतिम समाधान था। ब्रैंडन यहां बताया गया है कि मैं नाथन के समाधान का उपयोग करने और अपने स्वयं के संग्रह संपादक का उपयोग करने में सक्षम था।

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;
        }   
-1
Charlie Cole 16 फरवरी 2016, 23:01