Это хорошая практика, чтобы сделать следующую идею на основе ListView? - PullRequest
3 голосов
/ 15 ноября 2011

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

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

В данный момент я использую ListView, и я заполнил его своим объектом следующим образом:

enter image description here

Мой объект похож на:

public class TestData
{
public string Name {get;set;}
public double Force {get;set;}
public double PreTriggerVolt {get;set;}
public double PreTriggerCurr {get;set;}
public double TriggerVolt {get;set;}
public double TriggerCurr {get;set;}
public double PostTriggerVolt {get;set;}
public double PostTriggerCurr {get;set;}
}

Столбец Type жестко запрограммирован мной в ListView: P

У меня будет много этого в таблице.

Одна из проблем, иногда, например, после сбора данных, все или некоторые значения TriggerVolt должны быть добавлены / вычтены с помощью offset value. Вы можете сказать, что лучше очистить ListView, внести изменения в объект, используя foreach или что-то еще, а затем повторно создать ListView. Но разве нет способа напрямую указать на конкретную строку-столбец? Например, мне бы очень хотелось, чтобы я мог назвать клетку и назвать ее позже. что-то вроде: Cell[J6][PreTriggerVolt] == 0.01212 (просто общая идея)

Другая проблема - сортировка данных по имени, величине или ... Например, если я сортирую столбец Pin, строка под фактическим именем контакта может быть доминирующей. Я имею в виду Force : -0.1 например ... тогда все в моем списке просмотра рухнет !!! это будет огромный беспорядок.

И много других проблем, которые вы, возможно, уже знаете о ListView.

Я хочу знать, как лучше всего достичь этой цели.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

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

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

public class TestData:  INotifyPropertyChanged
{
private string _name;
public string Name
{
    get { return _name; }
    set
    {
        _name = value;
        this.NotifyPropertyChanged("Name");
    }
}

// I only included one property for simplicity.  You of course will need to do this
// for every property in the test model

public event PropertyChangedEventHandler PropertyChanged;

private void NotifyPropertyChanged(string name)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

}

1 голос
/ 15 ноября 2011

На мой взгляд, это не лучшая практика, это чрезвычайно хрупко, нюхать рядом со структурой TestData Structure или UI, и все это время перемен.Кроме того, инкапсуляция / разделение проблем - это плохо.

Пользовательский элемент управления привязан к Testdata, а затем панель табличных макетов, привязанная к их списку, будет более приятной.Таким образом, вы можете иметь дело с изменениями TestDataProperties в TestDataUIControl, а также добавлять / удалять и обновлять в TestDataUIControlList

Таким образом, twidlle со смещениями выполняется, например,

BindingList<TestData> 

Изменение TestDataэкземпляр запускает событие, которое обрабатывает элемент управления UI, и обновляет соответствующий элемент управления UI.

Аккуратно, аккуратно и красиво отделяет TestData от элемента управления, особенно если вы создаете для него интерфейс, например ITestData.

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