Горизонтальное выравнивание строк в нескольких таблицах с помощью веб-элемента управления

Мне нужно выровнять строки в разных таблицах, которые расположены горизонтально. Я бы предпочел поместить HTML-код в один пользовательский веб-элемент управления, чтобы я мог создать столько экземпляров этого элемента управления, сколько захочу, и расположить их горизонтально. Проблема в том, что текст в строках нужно переносить. Поэтому некоторые строки могут расширяться по вертикали, а некоторые - нет (см. Пример ниже). Когда это происходит, строки в других таблицах не выравниваются по горизонтали. Я знаю, что могу сделать все это, используя одну таблицу, но это означало бы, что мне пришлось бы дублировать html-код имени, адреса и телефона вместо динамического создания новых экземпляров моего пользовательского элемента управления (в действительности существует гораздо больше полей, чем это, но я держу это просто). Есть ли способ сделать это с помощью div, таблиц или чего-то еще?

Вот проблема: поле адреса Мэри Джейн расширяется на 2 строки, в результате чего ее поле телефона не совпадает с полями Джона и Боба.

Имя: Джон Доу Имя: Мэри Джейн Имя: Боб Смит 
Адрес: 123 бродвейский адрес: какой-то действительно длинный адрес Адрес: короткий адрес 
Телефон: 123-456, занимающий несколько линий Телефон: 111-2222 
 Телефон: 456-789

Я не ограничен каким-либо образом, как это сделать (кроме использования asp.net), но я бы предпочел использовать один веб-элемент управления, который я создаю X раз во время разработки (в этом примере это 3 раза). Я использую VS2008 и.Net 3.5

2 ответа

Решение

Просто чтобы все знали, это возможно. Я закончил решение с помощью jquery, и оно работает довольно хорошо. Я назначил каждой таблице определенный класс CSS и использовал его, чтобы определить, какие таблицы нужно изменить в размере (не хочу использовать идентификатор, поскольку каждая из них должна быть уникальной). Работает в 4 основных браузерах. Для IE7 не забудьте добавить пробел в пустые ячейки, чтобы это работало. Вот Javascript:

function ResizeTableRows() {
    // select tables by css class name using jquery
    var tables = $('.myCssClassName');

    // all tables should have the save number of rows, so just use the first one
    var totalRows = tables[0].rows.length;

    for (var rowNumber = 0; rowNumber < totalRows; rowNumber++) {
        var maxRowHeight = GetMaxRowHeight(tables, rowNumber);

        for (var i = 0; i < tables.length; i++) {
            if (maxRowHeight > 0) {
                tables[i].rows[rowNumber].height = maxRowHeight;
                SetCellHeight(tables[i].rows[rowNumber].cells, maxRowHeight);
            }
        }
    }
}

function GetMaxRowHeight(tables, rowNumber) {
    var maxRowHeight = 0;

    for (var i = 0; i < tables.length; i++) {
        var row1 = tables[i].rows[rowNumber];
        var cell1 = row1.cells[0];
        var rowHeight = row1.clientHeight;

        if (rowHeight <= 0) {
            rowHeight = row1.height;
        }        
        if (rowHeight <= 0) {
            rowHeight = cell1.clientHeight;
        }        

        if (rowHeight > maxRowHeight) {
            maxRowHeight = rowHeight;
        }
    }
    return maxRowHeight;
}

function SetCellHeight(cells, maxRowHeight) {
    for (var i = 0; i < cells.length; i++) {
        cells[i].height = maxRowHeight;
    }
}

Вот код для запуска процесса. Добавьте его на главную страницу, а не в веб-элемент управления (если вы используете.net)

<script type="text/javascript">
    // runs automatically after this page has been loaded and rendered
    $(document).ready(function() {
        ResizeTableRows();
    });
</script>

Визуализируйте свои данные, затем используйте javascript (пожалуйста, jQuery) на стороне клиента, чтобы найти все ваши ячейки td.address (например), найти ту, которая имеет наибольшую высоту, и установить для нее высоту всех остальных. Вы упоминаете другие области, поэтому логика может быть немного более сложной, но принцип остается в силе.

Некоторый быстрый код:

<script type="text/javascript">
  $(function() {
    var cells = $('td.address');
    var height;

    // some code to foreach on all relevant cells to find max size

     cells.each(function(index) {
       $(this).height(height));
    });
  });
</script>
Другие вопросы по тегам