Советы по наилучшему способу решения проблемы - C# Windows формы (списки, текстовое поле, ввод пользователя) - PullRequest
0 голосов
/ 13 января 2020

Я новичок в C# и запустил программу, которую я хочу получить от пользователя, отправить в список, отсортировать список, а затем сохранить результаты. Это происходит через два текстовых поля:

txtUsername txtResult

под текстовым полем находится кнопка, которая отключена, если оба текстовых поля не введены, кнопка ( btnAdd) добавляет результаты и имя учащегося в два отдельных списка:

lstUsername lstResult

, отключив кнопку, и убедитесь, что указаны только имя и результат введены и отправлены в списки в унисон, следующий бит для меня становится сложнее ..

Я хочу иметь возможность сортировать списки в порядке возрастания, чтобы сразу увидеть пользователь с самым высоким результатом, но это не будет достигнуто из-за того, что записи в каждом списке не связаны друг с другом. например, если поставить строку кода для сортировки рекордов, они не будут соответствовать пользователю в параллельном списке. Я только коснулся массивов, но понимаю, что данные между именем пользователя и результатом в окне списка нужно каким-то образом связать, чтобы они сопоставлялись даже после сортировки.

Это текущий код кнопки, который отправляет как имя пользователя, так и результат в поля списка:

        InitializeComponent();
        {
            btnAdd.Enabled = !string.IsNullOrWhiteSpace(txtResult.Text);
            btnAdd.Enabled = !string.IsNullOrWhiteSpace(txtUsername.Text);
        }


         private void btnAdd_Click(object sender, EventArgs e)
        {
            lstUsername.Items.Add(txtUsername.Text);
            lstResult.Items.Add(txtResult.Text);
            //There is also a counter that counts entries once being sent to the list
            txtScoreCount.Text = lstUsername.Items.Count.ToString(); 
            lstResult.Items.Count.ToString();
            txtResult.Clear();
            txtUsername.Clear();
            txtUsername.Focus();
            txtUsername.SelectAll();

        }

Если кто-то может дать совет о том, как я могу сопоставить записи два отдельных списка вместе, я был бы очень признателен, я также рад предоставить больше кода, если требуется. Любой совет полезен для меня. Я смогу сохранить данные и загрузить их обратно в списки самостоятельно, как только у меня будут данные в двух списках, спасибо.

1 Ответ

0 голосов
/ 14 января 2020

Это должно вас куда-то доставить.

using System;
using System.Drawing;
using System.Collections;
using System.Windows.Forms;

namespace Students2
{
    public partial class Form1 : Form
    {
        public class Student : ListViewItem
        { 
            public Student(string name, float grade) : base()
            {
                this.Text = name;
                //Add its grade as a subitem automatically.
                this.SubItems.Add(new ListViewSubItem(this, grade.ToString()));
            }
        }

        public class ListViewItemComparer : IComparer
        {
            private int ColIdx = 0;
            public ListViewItemComparer(int index) { ColIdx = index; }
            public int Compare(object x, object y) 
            { 
                switch(ColIdx)
                {              
                    case 1: //Numeric
                        {
                            var a1 = Convert.ToSingle(((ListViewItem)x).SubItems[ColIdx].Text);
                            var a2 = Convert.ToSingle(((ListViewItem)y).SubItems[ColIdx].Text);
                            return a1.CompareTo(a2);
                        }
                    default:
                        return String.Compare(((ListViewItem)x).SubItems[ColIdx].Text, ((ListViewItem)y).SubItems[ColIdx].Text);
                }              
            }
        }

        public Form1()
        {
            InitializeComponent();

            //Initialize ctrls
            TextBox txtUsername = new TextBox();
            TextBox txtGrade = new TextBox();
            Button btnAdd = new Button();
            ListView lBox = new ListView();

            //POS
            txtUsername.Location = new Point(0, 10);
            txtGrade.Location = new Point(0, 40);
            btnAdd.Location = new Point(0, 80);           
            lBox.Location = new Point(120, 0);

            //ListView props
            lBox.HeaderStyle = ColumnHeaderStyle.Clickable;
            lBox.View = View.Details;
            lBox.Size = new Size(200, 200);

            //Modify the whole LView sorting so both are synced.
            lBox.ColumnClick += new ColumnClickEventHandler((o, e) =>
            {
                lBox.ListViewItemSorter = new ListViewItemComparer(e.Column);
            });

            lBox.Columns.Add("Name");
            lBox.Columns.Add("Grade");

            this.Controls.Add(txtUsername);
            this.Controls.Add(txtGrade);
            this.Controls.Add(btnAdd);
            this.Controls.Add(lBox);

            btnAdd.Text = "Add";

            //Add a new Student object upon click (Inherits from ListViewItem)
            btnAdd.Click += new EventHandler((o, e) =>
            {
                try
                {
                    lBox.Items.Add(new Student(txtUsername.Text, Convert.ToSingle(txtGrade.Text)));
                    lBox.Refresh();
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Incorrect input.");
                }
            });

        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...