একটি নির্দিষ্ট ধরণের (বাটন / টেক্সটবক্স) উইন্ডোজ ফর্ম ফর্মের সমস্ত শিশু নিয়ন্ত্রণ কীভাবে পাবেন?


120

এক্স আকারের এমন ফর্মটিতে আমার সমস্ত নিয়ন্ত্রণ পেতে হবে get আমি নিশ্চিত যে আমি অতীতে একবার এই কোডটি দেখেছিলাম যা এরকম কিছু ব্যবহার করেছিল:

dim ctrls() as Control
ctrls = Me.Controls(GetType(TextBox))

আমি জানি যে আমি পুনরাবৃত্তি ফাংশনটি ব্যবহার করে বাচ্চাদের প্রাপ্ত সমস্ত নিয়ন্ত্রণের উপরে পুনরাবৃত্তি করতে পারি, তবে এর চেয়ে সহজ বা আরও সহজ কিছু আছে, সম্ভবত নীচের মত?

Dim Ctrls = From ctrl In Me.Controls Where ctrl.GetType Is Textbox

1
সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/253937/...
JYelton

উত্তর:


232

আপনার জন্য এখানে অন্য বিকল্প's আমি এটি একটি নমুনা অ্যাপ্লিকেশন তৈরি করে পরীক্ষা করেছি, তারপরে আমি প্রাথমিক গ্রুপবক্সের ভিতরে একটি গ্রুপবক্স এবং একটি গ্রুপবক্স রেখেছি। নেস্টেড গ্রুপবক্সের ভিতরে আমি 3 টি পাঠ্যবক্স নিয়ন্ত্রণ এবং একটি বোতাম রেখেছি। এটি আমার ব্যবহৃত কোড (এমনকি আপনি যে পুনরাবৃত্তিটি সন্ধান করেছিলেন তাও অন্তর্ভুক্ত)

public IEnumerable<Control> GetAll(Control control,Type type)
{
    var controls = control.Controls.Cast<Control>();

    return controls.SelectMany(ctrl => GetAll(ctrl,type))
                              .Concat(controls)
                              .Where(c => c.GetType() == type);
}

ফর্ম লোড ইভেন্টে এটি পরীক্ষা করতে আমি প্রাথমিক গ্রুপবক্সের অভ্যন্তরে সমস্ত নিয়ন্ত্রণের একটি গণনা চেয়েছিলাম

private void Form1_Load(object sender, EventArgs e)
{
    var c = GetAll(this,typeof(TextBox));
    MessageBox.Show("Total Controls: " + c.Count());
}

এবং এটি প্রতিবার যথাযথ গণনা ফিরিয়েছে, তাই আমি মনে করি আপনি যা খুঁজছেন তার জন্য এটি পুরোপুরি কাজ করবে :)


21
গেটএল () এখানে সংজ্ঞায়িত করা ক্লাস কন্ট্রোলে এক্সটেনশন পদ্ধতির জন্য খুব ভাল প্রার্থী
মাইকেল বাহিগ

আপনি যেভাবে ল্যাম্বদা এক্সপ্রেশন ব্যবহার করেছেন তা আমার পছন্দ হয়েছে। বিশদে ল্যাম্বডা এক্সপ্রেশন কোথায় শিখবেন?
আদিত্য বোকেদে

"'সিস্টেম.বাইন্ডোস.ফর্মস.কন্ট্রোল.কন্ট্রোলকলেশন' কাস্ট 'এর জন্য একটি সংজ্ঞা নেই এবং কোনও এক্সটেনশন পদ্ধতি' কাস্ট 'টাইপ' সিস্টেম. উইন্ডোজ.ফর্মস.কন্ট্রোল.কন্ট্রোলকলেশন 'টাইপের প্রথম আর্গুমেন্ট গ্রহণ করে না (পাওয়া যায়) আপনি কোনও নির্দেশিকা বা বিধানসভা উল্লেখ ব্যবহার করে নিখোঁজ?) "আমি চালু আছি। নেট 4.5 এবং" নিয়ন্ত্রণ "এর কোনও" কাস্ট "ফাংশন / পদ্ধতি / যা কিছু নেই has আমি কী মিস করছি?
আত্মবল্লাজার

2
@ সোলব্ল্যাজার যোগ করুন সিস্টেম.লিনক নেমস্পেস।
ইভান-মার্ক দেবোনো

var allCtl = getAll (this.FindForm (), typof (TextBox)); // এটি একটি ইউজারকন্ট্রোল কিছুই রিটার্ন দেয় !!
bh_earth0

33

সি # তে (যেহেতু আপনি এটির মতো ট্যাগ করেছেন) আপনি এটির মতো একটি লিনকিউ এক্সপ্রেশন ব্যবহার করতে পারেন:

List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();

পুনরাবৃত্তির জন্য সম্পাদনা করুন:

এই উদাহরণে, আপনি প্রথমে নিয়ন্ত্রণের তালিকা তৈরি করেন এবং তারপরে এটি জনপ্রিয় করার জন্য কোনও পদ্ধতিতে কল করুন। যেহেতু পদ্ধতিটি পুনরাবৃত্তিযোগ্য তাই এটি তালিকাটি ফিরিয়ে দেয় না, এটি কেবল এটি আপডেট করে।

List<Control> ControlList = new List<Control>();
private void GetAllControls(Control container)
{
    foreach (Control c in container.Controls)
    {
        GetAllControls(c);
        if (c is TextBox) ControlList.Add(c);
    }
}

Descendantsফাংশনটি ব্যবহার করে একটি লিনকিউ বিবৃতিতে এটি করা সম্ভব হতে পারে , যদিও আমি এর সাথে তেমন পরিচিত নই। সে সম্পর্কে আরও তথ্যের জন্য এই পৃষ্ঠাটি দেখুন ।

একটি সংগ্রহ ফিরে 2 সম্পাদনা করুন:

@ প্রোফক যেমন পরামর্শ দিয়েছেন, এমন একটি পদ্ধতি যা কেবল পছন্দসই নিয়ন্ত্রণগুলি দেয় কেবল সম্ভবত আরও ভাল অনুশীলন। এটি চিত্রিত করার জন্য আমি কোডটি নিম্নরূপে সংশোধন করেছি:

private IEnumerable<Control> GetAllTextBoxControls(Control container)
{
    List<Control> controlList = new List<Control>();
    foreach (Control c in container.Controls)
    {
        controlList.AddRange(GetAllTextBoxControls(c));
        if (c is TextBox)
            controlList.Add(c);
    }
    return controlList;
}

ধন্যবাদ, সি # বা ভিবি আমার পক্ষে ভাল। তবে সমস্যাগুলি হ'ল কন্ট্রোলস f অফটাইপ <টেক্সটবক্স> কেবলমাত্র বর্তমান নিয়ন্ত্রণের বাচ্চাদের ফিরিয়ে দেয় (আমার ক্ষেত্রে ফর্মটি), এবং আমি ফর্মায় "পুনরাবৃত্তভাবে" (চিইল্ডস, সাব-চাইল্ডস) সমস্ত নিয়ন্ত্রণ পেতে একটি একক কল করতে চাই want , উপ-সাব-চাইল্ডস, .....) এসিংল সংগ্রহে।
লুইস

আমি getAllControls নামে একটি পদ্ধতি নিয়ন্ত্রণের সংগ্রহ ফিরিয়ে আনতে আশা করব, যা আমি কন্ট্রোললিস্টে নির্ধারিত করব। শুধু ভাল অনুশীলন বলে মনে হচ্ছে।
প্রোফেকে

@ প্রফেক আমি আপনার সাথে একমত; সেই অনুসারে উদাহরণ পরিবর্তন করা।
জেলটন

13

এটি পুনরাবৃত্ত গেটএলকন্ট্রোলগুলির উন্নত সংস্করণ () যা প্রকৃতপক্ষে বেসরকারী ভার্সে কাজ করে:

    private void Test()
    {
         List<Control> allTextboxes = GetAllControls(this);
    }
    private List<Control> GetAllControls(Control container, List<Control> list)
    {
        foreach (Control c in container.Controls)
        {
            if (c is TextBox) list.Add(c);
            if (c.Controls.Count > 0)
                list = GetAllControls(c, list);
        }

        return list;
    }
    private List<Control> GetAllControls(Control container)
    {
        return GetAllControls(container, new List<Control>());
    }

10

আমি পূর্ববর্তী ধারণাগুলির একগুচ্ছকে একটি এক্সটেনশন পদ্ধতিতে সংযুক্ত করেছি। এখানে সুবিধাগুলি হ'ল আপনি সঠিকভাবে টাইপ করা গণনার পিছনে ফিরে আসুন, এবং উত্তরাধিকার যথাযথভাবে পরিচালনা করেছেন OfType()

public static IEnumerable<T> FindAllChildrenByType<T>(this Control control)
{
    IEnumerable<Control> controls = control.Controls.Cast<Control>();
    return controls
        .OfType<T>()
        .Concat<T>(controls.SelectMany<Control, T>(ctrl => FindAllChildrenByType<T>(ctrl)));
}

5

এটি করার জন্য আপনি একটি লিনকিউ কোয়েরি ব্যবহার করতে পারেন। এটি ফর্মের সমস্ত কিছুকে জিজ্ঞাসা করবে যা টাইপ টেক্সটবক্স

var c = from controls in this.Controls.OfType<TextBox>()
              select controls;

ধন্যবাদ, তবে থর জবাব হিসাবে একই সমস্যা, এটি কেবল চিডলগুলি ফেরত দেয় তবে সাবচিল্ডগুলি ইত্যাদি নয়, এবং আমি সমস্ত নিশ্চিত নিয়ন্ত্রণ চাই। আমি বেশ নিশ্চিত যে আমি এটি দেখেছি যে এটি একক পদ্ধতিতে কল যা নতুন। 3.5 বা 4.0-এ নতুন, এটি মনে আছে আমি দেখেছি যে কোনওভাবে ডেমোতে
লুইস

পুনরাবৃত্তি অভাব উপেক্ষা, var c = this.Controls.OfType<TextBox>()একই ফলাফল দিতে হবে না ?
কোডারডেনিস

2
@ ডেনিস: হ্যাঁ, এটি পছন্দ করার বিষয় (সাধারণত)। বিষয়টি সম্পর্কে একটি আকর্ষণীয় আলোচনার জন্য stackoverflow.com/questions/214500/… দেখুন ।
জেল্টন

5

এটি প্রাচীন কৌশল হতে পারে তবে এটি কবজির মতো কাজ করে। আমি নিয়ন্ত্রণের সমস্ত লেবেলের রঙ পরিবর্তন করতে পুনরাবৃত্তি ব্যবহার করেছি। এটি দুর্দান্ত কাজ করে।

internal static void changeControlColour(Control f, Color color)
{
    foreach (Control c in f.Controls)
    {

        // MessageBox.Show(c.GetType().ToString());
        if (c.HasChildren)
        {
            changeControlColour(c, color);
        }
        else
            if (c is Label)
            {
                Label lll = (Label)c;
                lll.ForeColor = color;
            }
    }
}

4

আমি সাইকো কোডারগুলির উত্তরটি সংশোধন করতে চাই: ব্যবহারকারী যেমন একটি নির্দিষ্ট ধরণের সমস্ত নিয়ন্ত্রণ পেতে চান আমরা জেনেরিকগুলি নিম্নলিখিত উপায়ে ব্যবহার করতে পারি:

    public IEnumerable<T> FindControls<T>(Control control) where T : Control
    {
        // we can't cast here because some controls in here will most likely not be <T>
        var controls = control.Controls.Cast<Control>();

        return controls.SelectMany(ctrl => FindControls<T>(ctrl))
                                  .Concat(controls)
                                  .Where(c => c.GetType() == typeof(T)).Cast<T>();
    }

এইভাবে, আমরা ফাংশনটি নীচের হিসাবে কল করতে পারি:

private void Form1_Load(object sender, EventArgs e)
{
    var c = FindControls<TextBox>(this);
    MessageBox.Show("Total Controls: " + c.Count());
}

এই পৃষ্ঠায় আমার মতে এটিই সেরা (এবং আমার পরীক্ষাগুলি অনুসারে দ্রুত) সমাধান। তবে আমি আপনাকে পরামর্শ দেব যে আপনি নিয়ন্ত্রণগুলিকে একটি অ্যারেতে পরিবর্তন করবেন: var enumerable = নিয়ন্ত্রণ হিসাবে নিয়ন্ত্রণ [] ?? controls.ToArray (); এবং তারপরে পরিবর্তন করুন: প্রত্যাবর্তনযোগ্য গণনা করুন e
র‌্যান্ডাল ফ্ল্যাগ

একই প্রভাব পাওয়ার .OfType<T>()চেয়ে লিনাক পদ্ধতিটি ব্যবহার করা কি আরও দক্ষ নয় .Where(c => c.GetType() == typeof(T)).Cast<T>();?
দ্য হিচেটেটর

3

ভুলে যাবেন না যে ধারক নিয়ন্ত্রণগুলি ছাড়াও অন্যান্য নিয়ন্ত্রণের মধ্যেও আপনি একটি টেক্সটবক্স রাখতে পারেন । এমনকি আপনি একটি চিত্রবক্সে একটি পাঠ্যবক্সও যুক্ত করতে পারেন।

সুতরাং আপনারও পরীক্ষা করা দরকার কিনা

someControl.HasChildren = True

যে কোন পুনরাবৃত্তি ফাংশন।

এই কোডটি পরীক্ষা করার জন্য একটি লেআউট থেকে আমার এই ফলাফল:

TextBox13   Parent = Panel5
TextBox12   Parent = Panel5
TextBox9   Parent = Panel2
TextBox8   Parent = Panel2
TextBox16   Parent = Panel6
TextBox15   Parent = Panel6
TextBox14   Parent = Panel6
TextBox10   Parent = Panel3
TextBox11   Parent = Panel4
TextBox7   Parent = Panel1
TextBox6   Parent = Panel1
TextBox5   Parent = Panel1
TextBox4   Parent = Form1
TextBox3   Parent = Form1
TextBox2   Parent = Form1
TextBox1   Parent = Form1
tbTest   Parent = myPicBox

সঙ্গে এই ব্যবহার করে দেখুন একটি বাটন এবং এক RichTextBox একটি ফর্মে।

Option Strict On
Option Explicit On
Option Infer Off

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim pb As New PictureBox
        pb.Name = "myPicBox"
        pb.BackColor = Color.Goldenrod
        pb.Size = New Size(100, 100)
        pb.Location = New Point(0, 0)
        Dim tb As New TextBox
        tb.Name = "tbTest"
        pb.Controls.Add(tb)
        Me.Controls.Add(pb)

        Dim textBoxList As New List(Of Control)
        textBoxList = GetAllControls(Of TextBox)(Me)

        Dim sb As New System.Text.StringBuilder
        For index As Integer = 0 To textBoxList.Count - 1
            sb.Append(textBoxList.Item(index).Name & "   Parent = " & textBoxList.Item(index).Parent.Name & System.Environment.NewLine)
        Next

        RichTextBox1.Text = sb.ToString
    End Sub

    Private Function GetAllControls(Of T)(ByVal searchWithin As Control) As List(Of Control)

        Dim returnList As New List(Of Control)

        If searchWithin.HasChildren = True Then
            For Each ctrl As Control In searchWithin.Controls
                If TypeOf ctrl Is T Then
                    returnList.Add(ctrl)
                End If
                returnList.AddRange(GetAllControls(Of T)(ctrl))
            Next
        ElseIf searchWithin.HasChildren = False Then
            For Each ctrl As Control In searchWithin.Controls
                If TypeOf ctrl Is T Then
                    returnList.Add(ctrl)
                End If
                returnList.AddRange(GetAllControls(Of T)(ctrl))
            Next
        End If
        Return returnList
    End Function

End Class

2

প্রতিবিম্ব ব্যবহার:

// Return a list with all the private fields with the same type
List<T> GetAllControlsWithTypeFromControl<T>(Control parentControl)
{
    List<T> retValue = new List<T>();
    System.Reflection.FieldInfo[] fields = parentControl.GetType().GetFields(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    foreach (System.Reflection.FieldInfo field in fields)
    {
      if (field.FieldType == typeof(T))
        retValue.Add((T)field.GetValue(parentControl));
    }
}

List<TextBox> ctrls = GetAllControlsWithTypeFromControl<TextBox>(this);

2

@ সাইকো কোডার সংস্করণটির Controlঅভিযোজন হিসাবে লিনকিউ ব্যবহারের জন্য এখানে আমার এক্সটেনশন পদ্ধতিটি রয়েছে :

পরিবর্তে এটি টাইপের একটি তালিকা নেয় GetAllযা আপনাকে যা চান তা পেতে আপনাকে একাধিক কলের প্রয়োজন হয় না । আমি বর্তমানে এটি একটি ওভারলোড সংস্করণ হিসাবে ব্যবহার করি।

public static IEnumerable<Control> GetAll(this Control control, IEnumerable<Type> filteringTypes)
{
    var ctrls = control.Controls.Cast<Control>();

    return ctrls.SelectMany(ctrl => GetAll(ctrl, filteringTypes))
                .Concat(ctrls)
                .Where(ctl => filteringTypes.Any(t => ctl.GetType() == t));
}

ব্যবহার:

//   The types you want to select
var typeToBeSelected = new List<Type>
{
    typeof(TextBox)
    , typeof(MaskedTextBox)
    , typeof(Button)
};

//    Only one call
var allControls = MyControlThatContainsOtherControls.GetAll(typeToBeSelected);

//    Do something with it
foreach(var ctrl in allControls)
{
    ctrl.Enabled = true;
}

2

একটি পরিষ্কার এবং সহজ সমাধান (সি #):

static class Utilities {
    public static List<T> GetAllControls<T>(this Control container) where T : Control {
        List<T> controls = new List<T>();
        if (container.Controls.Count > 0) {
            controls.AddRange(container.Controls.OfType<T>());
            foreach (Control c in container.Controls) {
                controls.AddRange(c.GetAllControls<T>());
            }
        }

        return controls;
    }
}

সমস্ত পাঠ্যবাক্স পান:

List<TextBox> textboxes = myControl.GetAllControls<TextBox>();

2

আপনি নীচের কোড ব্যবহার করতে পারেন

public static class ExtensionMethods
{
    public static IEnumerable<T> GetAll<T>(this Control control)
    {
        var controls = control.Controls.Cast<Control>();

        return controls.SelectMany(ctrl => ctrl.GetAll<T>())
                                  .Concat(controls.OfType<T>());
    }
}

2

এখানে আমার এক্সটেনশন পদ্ধতি। এটি খুব দক্ষ এবং এটি অলস।

ব্যবহার:

var checkBoxes = tableLayoutPanel1.FindChildControlsOfType<CheckBox>();

foreach (var checkBox in checkBoxes)
{
    checkBox.Checked = false;
}

কোডটি হ'ল:

public static IEnumerable<TControl> FindChildControlsOfType<TControl>(this Control control) where TControl : Control
    {
        foreach (var childControl in control.Controls.Cast<Control>())
        {
            if (childControl.GetType() == typeof(TControl))
            {
                yield return (TControl)childControl;
            }
            else
            {
                foreach (var next in FindChildControlsOfType<TControl>(childControl))
                {
                    yield return next;
                }
            }
        }
    }

এটি একটি ক্লিনার সংস্করণ যা অলস, অঙ্কিত করা যায় এবং চাহিদা অনুসারে পাওয়া যায়।
জোন পোলোভোরা

1

সমাধান এখানে।

https://stackoverflow.com/a/19224936/1147352

আমি কোডটির এই অংশটি লিখেছি এবং কেবল প্যানেলগুলিই নির্বাচন করেছি, আপনি আরও স্যুইচ বা আইএফএস যুক্ত করতে পারেন। এটা


1
public List<Control> GetAllChildControls(Control Root, Type FilterType = null)
{
    List<Control> AllChilds = new List<Control>();
    foreach (Control ctl in Root.Controls) {
        if (FilterType != null) {
            if (ctl.GetType == FilterType) {
                AllChilds.Add(ctl);
            }
        } else {
            AllChilds.Add(ctl);
        }
        if (ctl.HasChildren) {
            GetAllChildControls(ctl, FilterType);
        }
    }
    return AllChilds;
}

1
   IEnumerable<Control> Ctrls = from Control ctrl in Me.Controls where ctrl is TextBox | ctrl is GroupBox select ctr;

লাম্বদা এক্সপ্রেশন

IEnumerable<Control> Ctrls = Me.Controls.Cast<Control>().Where(c => c is Button | c is GroupBox);

আপনার উত্তরে আরও যুক্ত করুন যা কী ঘটছে এবং এটি প্রশ্নের সাথে কীভাবে সম্পর্কিত তা ব্যাখ্যা করে।
Fencer04

0

আমি @ সাইকো কোডার থেকে পরিবর্তন করেছি। সমস্ত নিয়ন্ত্রণ এখনই পাওয়া যাবে (নেস্টেড অন্তর্ভুক্ত)।

public static IEnumerable<T> GetChildrens<T>(Control control)
{
  var type = typeof (T);

  var allControls = GetAllChildrens(control);

  return allControls.Where(c => c.GetType() == type).Cast<T>();
}

private static IEnumerable<Control> GetAllChildrens(Control control)
{
  var controls = control.Controls.Cast<Control>();
  return controls.SelectMany(c => GetAllChildrens(c))
    .Concat(controls);
}

0

এটি কাজ করতে পারে:

Public Function getControls(Of T)() As List(Of T)
    Dim st As New Stack(Of Control)
    Dim ctl As Control
    Dim li As New List(Of T)

    st.Push(Me)

    While st.Count > 0
        ctl = st.Pop
        For Each c In ctl.Controls
            st.Push(CType(c, Control))
            If c.GetType Is GetType(T) Then
                li.Add(CType(c, T))
            End If
        Next
    End While

    Return li
End Function

আমি মনে করি আপনি যে সমস্ত কন্ট্রোলের বিষয়ে কথা বলছেন তা পেতে ফাংশনটি কেবল ডাব্লুপিএফের কাছে উপলব্ধ ।


0

এখানে একটি পরীক্ষিত এবং কার্যকর জেনেরিক সমাধান দেওয়া হয়েছে:

আমার কাছে একটি বিশাল সংখ্যার আপডাউনসংখ্যক নিয়ন্ত্রণ রয়েছে, কিছু মূল ফর্মে, কিছু ফর্মের মধ্যে গ্রুপবক্সে। আমি ব্যাক-কালারকে সবুজ রঙে পরিবর্তন করতে কেবলমাত্র একটি শেষ নির্বাচিত নিয়ন্ত্রণ চাই, যার জন্য আমি এই পদ্ধতিটি ব্যবহার করে প্রথমে অন্য সকলকে সাদাতে সেট করেছি: (নাতি নাতনিতেও প্রসারিত হতে পারে)

    public void setAllUpDnBackColorWhite()
    {
        //To set the numericUpDown background color of the selected control to white: 
        //and then the last selected control will change to green.

        foreach (Control cont in this.Controls)
        {
           if (cont.HasChildren)
            {
                foreach (Control contChild in cont.Controls)
                    if (contChild.GetType() == typeof(NumericUpDown))
                        contChild.BackColor = Color.White;
            }
            if (cont.GetType() == typeof(NumericUpDown))
                cont.BackColor = Color.White;
       }
    }   

শিশু নিয়ন্ত্রণের নিজস্ব সন্তান থাকলে এটি কাজ করে না।
Soublazer

0

আপনি চাইলে এটি চেষ্টা করে দেখতে পারেন :)

    private void ClearControls(Control.ControlCollection c)
    {
        foreach (Control control in c)
        {
            if (control.HasChildren)
            {
                ClearControls(control.Controls);
            }
            else
            {
                if (control is TextBox)
                {
                    TextBox txt = (TextBox)control;
                    txt.Clear();
                }
                if (control is ComboBox)
                {
                    ComboBox cmb = (ComboBox)control;
                    if (cmb.Items.Count > 0)
                        cmb.SelectedIndex = -1;
                }

                if (control is CheckBox)
                {
                    CheckBox chk = (CheckBox)control;
                    chk.Checked = false;
                }

                if (control is RadioButton)
                {
                    RadioButton rdo = (RadioButton)control;
                    rdo.Checked = false;
                }

                if (control is ListBox)
                {
                    ListBox listBox = (ListBox)control;
                    listBox.ClearSelected();
                }
            }
        }
    }
    private void btnClear_Click(object sender, EventArgs e)
    {
        ClearControls((ControlCollection)this.Controls);
    }

1
কেবল পোস্টিং কোড ওপিকে তাদের সমস্যা বা আপনার সমাধান বুঝতে সহায়তা করে। আপনার কোডটি সহ আপনার প্রায় সবসময় কোনও ধরণের ব্যাখ্যা অন্তর্ভুক্ত করা উচিত।
লিগেরো

ফর্মটি সাফ করার বিষয়ে প্রশ্নে কিছু বলা হয়নি।
লার্সটেক

হ্যাঁ, "প্রশ্নের" উত্তর দেয় না, তবে এটিতে একটি দুর্দান্ত সংযোজন। ধন্যবাদ!

0

যদিও আরও বেশ কয়েকটি ব্যবহারকারী পর্যাপ্ত সমাধান পোস্ট করেছেন, তবে আমি আরও সাধারণ পদ্ধতির পোস্ট করতে চাই যা আরও কার্যকর হতে পারে।

এটি মূলত জেল্টনের প্রতিক্রিয়া ভিত্তিক is

public static IEnumerable<Control> AllControls(
    this Control control, 
    Func<Control, Boolean> filter = null) 
{
    if (control == null)
        throw new ArgumentNullException("control");
    if (filter == null)
        filter = (c => true);

    var list = new List<Control>();

    foreach (Control c in control.Controls) {
        list.AddRange(AllControls(c, filter));
        if (filter(c))
            list.Add(c);
    }
    return list;
}

0
    public static IEnumerable<T> GetAllControls<T>(this Control control) where T : Control
    {
        foreach (Control c in control.Controls)
        {
            if (c is T)
                yield return (T)c;
            foreach (T c1 in c.GetAllControls<T>())
                yield return c1;
        }
    }


0

Controlক্লাসের এক্সটেনশান হিসাবে লিখিত অ্যাডামের সি # কোডের যে কোনও ভিবি সংস্করণ সন্ধান করছেন যে কেউ :

''' <summary>Collects child controls of the specified type or base type within the passed control.</summary>
''' <typeparam name="T">The type of child controls to include. Restricted to objects of type Control.</typeparam>
''' <param name="Parent">Required. The parent form control.</param>
''' <returns>An object of type IEnumerable(Of T) containing the control collection.</returns>
''' <remarks>This method recursively calls itself passing child controls as the parent control.</remarks>
<Extension()>
Public Function [GetControls](Of T As Control)(
    ByVal Parent As Control) As IEnumerable(Of T)

    Dim oControls As IEnumerable(Of Control) = Parent.Controls.Cast(Of Control)()
    Return oControls.SelectMany(Function(c) GetControls(Of T)(c)).Concat(oControls.Where(Function(c) c.GetType() Is GetType(T) Or c.GetType().BaseType Is GetType(T))
End Function

দ্রষ্টব্য: আমি যে BaseTypeকোনও উদ্ভূত কাস্টম নিয়ন্ত্রণের সাথে মিল রেখেছি । আপনি যদি এটি চান তবে এটি সরিয়ে ফেলতে পারেন বা এটি একটি alচ্ছিক প্যারামিটারও তৈরি করতে পারেন।

ব্যবহার

Dim oButtons As IEnumerable(Of Button) = Me.GetControls(Of Button)()

0

পদ্ধতি তৈরি করুন

public static IEnumerable<Control> GetControlsOfType<T>(Control control)
{
    var controls = control.Controls.Cast<Control>();
    return controls.SelectMany(ctrl => GetControlsOfType<T>(ctrl)).Concat(controls).Where(c => c is T);
}

এবং এটি ব্যবহার করুন

Var controls= GetControlsOfType<TextBox>(this);//You can replace this with your control

0

আমি ভিবি ব্যবহার করে সালদী তাই আমি একটি এক্সটেনশন পদ্ধতি লিখেছিলাম। যা নিয়ন্ত্রণের সমস্ত শিশু এবং উপ-শিশুদের পুনরুদ্ধার করে

Imports System.Runtime.CompilerServices
Module ControlExt

<Extension()>
Public Function GetAllChildren(Of T As Control)(parentControl As Control) As IEnumerable(Of T)
    Dim controls = parentControl.Controls.Cast(Of Control)
    Return controls.SelectMany(Of Control)(Function(ctrl) _
        GetAllChildren(Of T)(ctrl)) _
        .Concat(controls) _
        .Where(Function(ctrl) ctrl.GetType() = GetType(T)) _
    .Cast(Of T)
End Function

End Module

তারপরে আপনি এটির মতো ব্যবহার করতে পারেন যেখানে "বিটিএনলিস্ট" একটি নিয়ন্ত্রণ

btnList.GetAllChildren(Of HtmlInputRadioButton).FirstOrDefault(Function(rb) rb.Checked)

এই ক্ষেত্রে এটি নির্বাচিত রেডিও বোতামটি নির্বাচন করবে।


-1

কেবল:

For Each ctrl In Me.Controls.OfType(Of Button)()
   ctrl.Text = "Hello World!"
Next

এটি কেবল "মি" এর নিয়ন্ত্রণ সংগ্রহের মধ্যে সরাসরি নিয়ন্ত্রণগুলি খুঁজে পেতে পারে এবং কোনও বাচ্চা ধারকগুলির মধ্যে থাকা বাটন নিয়ন্ত্রণগুলি খুঁজে পাবেন না কারণ পোস্টারটি "সমস্ত" দ্বারা বোঝানোর চেষ্টা করছে।
ChrisPBacon
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.