मेरे पास नाम, आयु, लिंग और संदेश जैसे कुछ गुणों वाले उपयोगकर्ताओं का एक वर्ग है और इसलिए मेरे पास एक फॉर्म है कि इसमें प्रत्येक उपयोगकर्ता की प्रत्येक संपत्ति के लिए गतिशील रूप से बनाए गए कुछ टेक्स्ट बॉक्स हैं और मैं प्रत्येक टेक्स्टबॉक्स को उचित गुणों से जोड़ता हूं।

जब उपयोगकर्ता मेरे प्रोग्राम से जुड़ते हैं और अपने गुण बदलते हैं तो टेक्स्ट बॉक्स नहीं बदलते हैं।

यह मेरा उपयोगकर्ता वर्ग है:

using System.ComponentModel;
using System.Runtime.CompilerServices;

namespace binding_network
{
    class user : INotifyPropertyChanged
    {
        private string _name;

        public string Name
        {
            get { return _name; }
            set
            {
                if (_name != value)
                {
                    _name = value;
                    NotifyPropertyChanged();
                }
            }
        }
        private int _age;

        public int Age
        {
            get { return _age; }
            set
            {
                if (_age != value)
                {
                    _age = value;
                    NotifyPropertyChanged();
                }
            }
        }
        private string _message;

        public string Message
        {
            get { return _message; }
            set
            {
                if (_message != value)
                {
                    _message = value;
                    NotifyPropertyChanged();
                }
            }
        }
        private string _gender;

        public string Gender
        {
            get { return _gender; }
            set
            {
                if (true)
                {
                    _gender = value;
                    NotifyPropertyChanged();
                }
            }
        }




        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

और यह मेरा फॉर्म कोड है:

public partial class Form1 : Form
{
    private BindingSource userBindingSource = new BindingSource();
    BindingList<user> userList = new BindingList<user>();
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ///some code to create textboxes dynamically....

        txtName.DataBindings.Clear();
        txtName.DataBindings.Add("text", userBindingSource[userIndex], "name");
        txtAge.DataBindings.Clear();
        txtAge.DataBindings.Add("text", userBindingSource[userIndex], "age");
        txtGender.DataBindings.Clear();
        txtGender.DataBindings.Add("text", userBindingSource[userIndex], "gender");
        txtMessage.DataBindings.Clear();
        txtMessage.DataBindings.Add("text", userBindingSource[userIndex], "message");
    }
}

और इस विधि से, मुझे नेटवर्क द्वारा डेटा प्राप्त होता है

private void GetMessage(object obj)
{
    user user1 = (user)obj;
    try
    {
        while (true)
        {
            byte[] buffer = new byte[1024];
            int rec = user1.SocketClient.Receive(buffer, 0, buffer.Length, 0);
            Array.Resize(ref buffer, rec);
            if (rec > 0)
            {
                user1.Name = BitConverter.ToString(buffer, 0);
                user1.Gender = BitConverter.ToString(buffer, 80);
                user1.Age = BitConverter.ToInt32(buffer, 96);
                user1.Message = BitConverter.ToString(buffer, 160);
            }
        }

    }
    catch (Exception ex)
    {

        MessageBox.Show(ex.ToString());
    }

}

लेकिन डेटा प्राप्त करने के बाद टेक्स्टबॉक्स रीफ्रेश नहीं होते हैं

1
robert 29 मार्च 2020, 00:17

1 उत्तर

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

ऐसा लगता है कि बहुत सारे कोड गायब हैं, लेकिन यहां कुछ चीजें हैं ...

userBindingSource को userList से कनेक्ट नहीं किया गया है।

बाइंडिंग propertyName और dataMember पैरामीटर में गलत केसिंग है।

userIndex परिभाषित नहीं है।

भले ही, userBindingSource[userIndex] के लिए बाध्यकारी स्रोत के नेविगेशन की अनुमति नहीं देता है (शायद आप इसके साथ ठीक हैं)।

तो चलिए इन्हें ठीक करते हैं:

public partial class Form1 : Form
{
    private BindingSource userBindingSource = new BindingSource();
    BindingList<user> userList = new BindingList<user>();
    int userIndex = 0;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        userBindingSource.DataSource = userList;
        userIndex = userBindingSource.Position;

        ///some code to create textboxes dynamically....

        txtName.DataBindings.Clear();
        txtName.DataBindings.Add("Text", userBindingSource, "Name");
        txtAge.DataBindings.Clear();
        txtAge.DataBindings.Add("Text", userBindingSource, "Age");
        txtGender.DataBindings.Clear();
        txtGender.DataBindings.Add("Text", userBindingSource, "Gender");
        txtMessage.DataBindings.Clear();
        txtMessage.DataBindings.Add("Text", userBindingSource, "Message");
    }
}

यह मानते हुए कि userList आबाद हो गया है, अब आप userBindingSource को इस तरह से नेविगेट कर सकते हैं:

// However you're tracking userIndex, or maybe...
// userIndex = userList.IndexOf(user1);
userBindingSource.Position = userIndex;

या इनमें से कोई:

userBindingSource.MoveFirst();
userBindingSource.MovePrevious();
userBindingSource.MoveNext();
userBindingSource.MoveLast();

और अंत में, GetMessage में अनंत while (true) लूप को हटा दें।

इस बिंदु पर, यदि आपका डेटा सही ढंग से प्राप्त और पार्स किया गया है, तो आपके TextBox नियंत्रण अपडेट होने चाहिए।

संपादित करें...

तो आप इसे मल्टी-थ्रेडिंग कर रहे हैं, जो बहुत अच्छा है।

अब हमें यह सुनिश्चित करना है कि UI परिवर्तन के परिणामस्वरूप सभी ऑपरेशन उचित थ्रेड पर किए गए हैं।

ऐसा करते हैं (यह मानते हुए कि GetMessage को Form वर्ग के अंदर परिभाषित किया गया है):

        if (rec > 0)
        {
            var name = BitConverter.ToString(buffer, 0);
            var gender = BitConverter.ToString(buffer, 80);
            var age = BitConverter.ToInt32(buffer, 96);
            var message = BitConverter.ToString(buffer, 160);

            this.Invoke(new Action(() =>
            {
                user1.Name = name;
                user1.Gender = gender;
                user1.Age = age;
                user1.Message = message;
            }));
        }

और इस:

catch (Exception ex)
{
    this.Invoke(new Action(() => MessageBox.Show(ex.ToString())));
}

और बाध्यकारी स्रोत नेविगेशन (यदि एक अलग धागे पर):

this.Invoke(new Action(() => userBindingSource.Position = userIndex));

आप BeginInvoke विधि का उपयोग करने पर भी विचार कर सकते हैं।

0
rfmodulator 29 मार्च 2020, 17:51