Для каждой DataTable добавьте UserControl в FlowLayoutPanel

Я создал UserControl с изображением и двумя метками: labelName labelUsername

Я также создал DataSet и DataTable, которые получают данные из базы данных SQL CE. Этот бит работает нормально, так как мне удалось просмотреть все строки DataTable и отобразить информацию в MessageBox.

Теперь я хочу отобразить UserControl в FlowLayoutPanel для всех строк в DataTable и заполнить две метки значениями Name и Username из DataTable. Здесь я застрял, так как не знаю, что кодировать в UserControl и что кодировать в форме, содержащей FlowLayoutPanel.

Может кто-нибудь помочь мне, пожалуйста?


person hshah    schedule 25.09.2012    source источник


Ответы (1)


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

В вашем UserControl выставьте свойство Text каждой из двух ваших меток в свойстве или методе. Если вы выберете свойство, оно может выглядеть примерно так для вашего ярлыка labelUsername:

public string Username {
    set { labelUsername.Text = value; }
}

В вашем цикле формы через все DataRows во всех DataTables в вашем DataSet и для каждого DataRow создайте экземпляр вашего UserControl и добавьте каждый в свою FlowLayoutPanel. Используйте соответствующие значения столбца в своих DataRows, чтобы установить значения метки UserControl:

foreach (DataTable dt in ds.Tables) {
    foreach (DataRow row in dt.Rows) {
        var uc = new YourUserControl { Username = row["usernameColumn"].ToString(), 
                                       Name = row["nameColumn"].ToString() };
        flowLayoutPanel1.Controls.Add(uc);
    }
}
person Jay Riggs    schedule 25.09.2012
comment
Вы случайно не знаете, почему .MouseClick, который я реализовал, кажется, работает только тогда, когда я выбираю пробел в UserControl, а не метку или изображение в UserControl? - person hshah; 26.09.2012
comment
Рад, что это работает. Бьюсь об заклад, вы видите описанное поведение щелчка мыши, потому что событие MouseClick зарегистрировано только для UserControl, а не для его дочерних элементов управления. Одним из решений является регистрация обработчика событий MouseClick унифицированных коммуникаций для каждого элемента управления, если он находится под управлением вашего ребенка. Это достаточно легко сделать в дизайнере: выберите дочерний элемент управления, просмотрите его события в окне свойств и в его раскрывающемся списке событий MouseClick выберите событие, которое вы уже создали для UC. - person Jay Riggs; 26.09.2012
comment
Если я создал событие в форме, я не вижу его в UserControl. Это правильно? - person hshah; 26.09.2012
comment
@hshad В этом случае вы должны создать событие в своем UC, которое срабатывает, когда какая-либо часть вашего UC вызывает событие MouseClicked. Вы все равно создадите обработчик событий MouseClicked в своем UC, как я описал в своем предыдущем комментарии, а в MouseClicked вы запустите событие своего UC. Теперь, когда вы создаете экземпляры вашего UC в своей форме, подпишитесь на пользовательское событие вашего UC, используя такой код: uc.MyUCMouseClick += UC_MyClickEvent; Если я не ясно выразился здесь, я могу обновить свой ответ дополнительным кодом. - person Jay Riggs; 26.09.2012
comment
Если бы вы могли прокомментировать этот вопрос, пожалуйста, было бы здорово: stackoverflow. ком/вопросы/12608300/ - person hshah; 27.09.2012