2015-03-10 3 views
0

Краткое интроХотите добавить некоторые элементы из списка в DataSource

Программа работает тест на машинах. Затем появляется диалоговое окно с запросом пользователя, правильно ли работали все машины. Если они скажут, что в окне dataGridView не появится другое окно с вопросом, с какими машинами провалился метод checkBox. Затем он устанавливает статус в состояние ОШИБКИ, чтобы программа продолжала работать, игнорируя машины с ошибками.

У меня есть этот класс с двумя свойствами

public class ASM 
{ 
    public byte DeviceID 
    public ASMStatus Status 
} 

я ставлю это в списке

list<ASM001.ASM> ASMs = new list(); 

Теперь я хочу, чтобы добавить этот список BindingSource в моей DataGridView, но только те, чей статус equals ASMStatus.IDLE

Я думал о том, что просто создаю те, которые простаивают в другом списке и прикрепляют их к списку привязки, однако dataGridView al поэтому имеет столбец CheckBox, который определяет, должен ли быть изменен на ASMStatus.ERROR

public partial class FailedMessageBox : Form 
{ 
    public FailedMessageBox() 
    { 
     InitializeComponent(); 
     DataGridViewCheckBoxColumn col1 = new DataGridViewCheckBoxColumn(); 
     col1.HeaderText = "Device Failed"; 
     dataGridView1.Columns.Add(col1); 

    } 

    private void FailedMessageBox_Load(object sender, EventArgs e) 
    { 
     dataGridView1.DataSource = Global.ASMs; 
    } 
} 

Я хочу, чтобы убедиться, что, когда пользователь нажимает кнопку OK текущий ПКР в списке приготовьтесь к ошибкам, поэтому я думал, что статус bindlist будет работать наилучшим образом

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

+0

Простой 'dataGridView1.DataSource = Global.ASMs.Where (a => a.Status == ASMStatus.IDLE);' трюк? –

+0

Это не сработало. Я пробовал его с помощью Global.ASMs.Select (a => a.Status == ASMStatus.IDLE) также –

ответ

0

А что-то подобное в вашем Page_Load:

using(var context = new DbContext()) 
{ 
    // You could put a Where Clause here to limit the returns 
    // i.e. context.ASMs.Where(s => s.Status == ASMStatus.IDLE).Load() 
    context.ASMs.Load(); 
    var data = context.ASMs.Local.ToBindingList(); 

    var bs = new BindingSource(); 

    bs.DataSource = data; 
    dataGridView1.DataSource = bs; 
} 

Вы должны добавить BindingSource непосредственно на страницу, но я просто показываю, добавив его в коде. Затем вы можете получить к нему доступ вот так:

foreach(DataRow row in dataGridView1.Rows) 
{ 
    if ((bool) row.Cells["Device Failed"].Value == true) 
    { 
     var line = row.DataBoundItem(); 
     line.Status = ASMStatus.ERROR; 
    } 
} 

Обязательно сохраните изменения.