Как сохранить выбранный элемент (который имеет форматирование строки) в нескольких текстовых полях - PullRequest
0 голосов
/ 19 декабря 2018

В настоящее время я работаю над системой, в которой элементы сохраняются как задачи, одна из функций - редактирование одной из этих задач.каждый элемент в списке отформатирован и добавлен следующим образом:

listFormat = "{0, -10} {1,-35} {2, -20} {3, -20} {4, -20} {5, -15} {6, -10}";
lstMain.Items.Add(string.Format(listFormat, sName, sSpec, sType, sProgress, sContact, sStart, sEnd));

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

Примечание: как только я смогу поместить каждую часть элемента в списке в несколько текстовых полей, я смогу добавитьих обратно, это не проблема, мне просто нужно, чтобы получить их там.Большое спасибо.

1 Ответ

0 голосов
/ 19 декабря 2018

Вы можете подумать о создании класса Task, который имеет свойства для каждого из этих элементов и, возможно, переопределение ToString, которое выводит вашу строку.Затем вы можете иметь BindingList из них, а затем привязать список к нему.

Таким образом, вы можете легко редактировать и обновлять свой ListBox.

Вот пример копирования / вставки, которыйдолжно помочьКласс Task находится внизу:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    // This will hold the items displayed in the ListBox
    private BindingList<Task> taskList;

    // Manually creating the controls here so you can copy/paste
    private ListBox taskListBox;
    private Button btnEdit;

    private void Form1_Load(object sender, EventArgs e)
    {
        // Create a few "Tasks" and add them to our BindingList
        taskList = new BindingList<Task>
        {
            new Task("john", "jSpec", "jType", "jProg",
                "jContact", "jStart", "jEnd"),
            new Task("mary", "mSpec", "mType", "mProg",
                "mContact", "mStart", "mEnd"),
            new Task("luther", "lSpec", "lType", "lProg",
                "lContact", "lStart", "lEnd"),
        };

        // Create the ListBox
        taskListBox = new ListBox
        {
            Width = Width - 50,
            Left = 10,
            Top = 30,
            DataSource = taskList
        };

        Controls.Add(taskListBox);

        // Create the Button
        btnEdit = new Button
        {
            Text = "Edit Task",
            Width = 100,
            Left = taskListBox.Left + taskListBox.Width - 100,
            Top = taskListBox.Top + taskListBox.Height + 10
        };
        btnEdit.Click += BtnEdit_Click;

        Controls.Add(btnEdit);
    }

    // When you select an item in the list box and click the button,
    // the selected item will be automatically updated. You can modify
    // this code to get the actual values from the user for whatever 
    // properties you want the user to be able to update
    private void BtnEdit_Click(object sender, EventArgs e)
    {
        // Pretend we get a value from the user
        var newName = "New Name";
        var newEnd = "New End";

        // Get the selected task
        var selectedTask = taskList[taskListBox.SelectedIndex];

        // Change some of it's property values
        selectedTask.Name = newName;
        selectedTask.End = newEnd;

        // Update the data in the listbox and notify the user
        taskList.ResetBindings();
        MessageBox.Show("Updated selected item");
    }
}

// The Task class, with properties to represent the values from your code sample
public class Task
{
    public string Name { get; set; }
    public string Spec { get; set; }
    public string Type { get; set; }
    public string Progress { get; set; }
    public string Contact { get; set; }
    public string Start { get; set; }
    public string End { get; set; }

    public Task(string name, string spec, string type, string progress,
        string contact, string start, string end)
    {
        Name = name; Spec = spec; Type = type; Progress = progress;
        Contact = contact; Start = start; End = end;
    }

    public override string ToString()
    {
        return $"{Name,-10} {Spec,-35} {Type,-20} {Progress,-20} " +
               $"{Contact,-20} {Start,-15} {End,-10}";
    }
}

Теперь, чтобы ответить на ваш вопрос о добавлении элементов в текстовые поля - это довольно просто.В событии выбора, измененного в списке, вы можете взять выбранную задачу (см. Пример кода в событии щелчка кнопки) и установить для каждого текстового поля одно из свойств выбранной задачи.

Затем в кнопкесобытие click, мы уже получаем выбранный Task, поэтому все, что вам нужно сделать, это установить для каждого свойства правильное значение из каждого текстового поля.

...