मैं एक पैनल (panelMetaData) पर इन नियंत्रणों को स्वचालित रूप से प्रदर्शित करने की कोशिश कर रहा हूं। सब कुछ स्क्रीन पर दिखाई देता है और कुछ हद तक संरेखित किया जाता है, जबकि कुछ लेबल टेक्स्ट दूसरों को कवर करता है आदि क्या मैं इस नियंत्रण को ठीक से स्थित होने के लिए कर सकता हूं? कोई भी स्थान तर्क मुझे याद आ रहा है?

{{X 1}} को {{X12}}, AutoSize:True और AutoScroll:True गुणों के साथ टूलबॉक्स से (ड्रैग एंड ड्रॉप) का उपयोग करके जोड़ा गया था।

enter image description here

यह वह विधि है जो नियंत्रण बनाता है और उन्हें पैनल में रखता है: (मैंने पढ़ने को आसान बनाने के लिए कुछ कोड हटा दिए)

private void createAttributePanelControls()
{

    txtboxes = new List<Control>();
    labels = new List<Control>();
    valLabel = new List<Control>();
    combobox = new List<Control>();
    datetimetxtboxes = new List<Control>();

    int stringcnt = 0;
    int datecnt = 0;
    int listcnt = 0;

    for (int i = 0; i < attributes.Length; i++)
    {
        Attribute attribute = attributes[i];

        labels.Add(CreateLabel(attribute.getDisplayName(), i, new Point(26, 56 + (i * 30))));
        panelMetaData.Controls.AddRange(labels.ToArray());


        switch (attribute.getType())
        {
            case DocAttribute.STRING:

                txtboxes.Add(CreateTextBox(attribute.getDisplayName(), i, new Point(labels[i].Width, labels[i].Top - 3)));
                 valLabel.Add(CreateValidationLabel(attribute.getDisplayName(), i, new Point(txtboxes[stringcnt].Width, labels[i].Top - 3)));  
                stringcnt++;
                break;
            case DocAttribute.DATE:

                datetimetxtboxes.Add(CreateDateTimePicker(attribute.getDisplayName(), i, new Point(labels[i].Widt, 56 + (i * 30))));
                 valLabel.Add(CreateValidationLabel(attribute.getDisplayName(), i, new Point(datetimetxtboxes[datecnt].Width, labels[i].Top - 3))); 
                datecnt++;
                break;
            case DocAttribute.LIST:
                combobox.Add(CreateComboBox(attribute.getDisplayName(), i, new Point(labels[i].Widt, 56 + (i * 30))));
                valLabel.Add(CreateValidationLabel(attribute.getDisplayName(), i, new Point(combobox[listcnt].Width, labels[i].Top - 3))); 
                listcnt++;
                break;
        }

    }

    if (txtboxes.Any()) panelMetaData.Controls.AddRange(txtboxes.ToArray());
    if (datetimetxtboxes.Any()) panelMetaData.Controls.AddRange(datetimetxtboxes.ToArray());
    if (combobox.Any()) panelMetaData.Controls.AddRange(combobox.ToArray());
    if (valLabel.Any()) panelMetaData.Controls.AddRange(valLabel.ToArray());
}

ये बनाने के तरीके हैं:

private TextBox CreateTextBox(string text, int value, Point location)
{
    TextBox textbox = new TextBox();
    textbox.Name =//somelogic
    textbox.Location = new Point(location.X, location.Y);
    textbox.Size = new Size(300, 21);

    return textbox;
}


private DateTimePicker CreateDateTimePicker(string text, int value, Point location)
{
    DateTimePicker datetextbox = new DateTimePicker();
    datetextbox.Name = //somelogic
    datetextbox.Location = new Point(location.X, location.Y);
    datetextbox.Size = new Size(300, 21);

    return datetextbox;
}


private ComboBox CreateComboBox(string text, int value, Point location)
{
    ComboBox combobox = new ComboBox();
    combobox.Name = //somelogic;
    combobox.Location = new Point(location.X, location.Y);
    combobox.Size = new Size(300, 21);

    return combobox;
}


private Label CreateLabel(string text, int value, Point location)
{
    Label label = new Label();
    label.Name =//somelogic;
    label.Location = new Point(location.X, location.Y);
    label.AutoSize = true;

    return label;
}


private Label CreateValidationLabel(string text, int value, Point location)
{
    Label label = new Label();
    label.Name = "vlb" + (text.Contains(".") ? text.Substring(0, text.IndexOf(".")) : text);
    label.Text = "*";
    label.Tag = value;
    label.Location = new Point(location.X, location.Y);
    label.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    label.ForeColor = System.Drawing.Color.Red;
    label.AutoSize = true;

    return label;
}
1
Undisputed007 23 नवम्बर 2015, 14:29

2 जवाब

सबसे बढ़िया उत्तर

उत्तर पढ़ने से पहले, इस पर विचार करना बेहतर है:

लेकिन गलत तर्क जो मैं आपके कोड में देख सकता हूं, वह है:

आपने AutoSize प्रॉपर्टी को true सेट करते समय आपने अपने लेबल्स के लिए कोई टेक्स्ट सेट नहीं किया है और फिर आपने उन्हें panelMetaData.Controls में जोड़ा और इससे उनका साइज़ (0,0) हो गया। तब आपने नियंत्रण की स्थिति के लिए Width लेबल का उपयोग किया है और चूंकि Width का लेबल 0 है, आपके नियंत्रण Location.X = 0 के साथ दिखाए जाएंगे

2
Reza Aghaei 23 नवम्बर 2015, 11:58

मैंने देखा है कि आप अगले नियंत्रण स्थान के लिए आधार के रूप में Control.Width संपत्ति का उपयोग करते हैं। आपको वास्तव में उस उद्देश्य के लिए Control.Right संपत्ति का उपयोग करना चाहिए।

2
Ivan Stoev 23 नवम्बर 2015, 12:05