Что является противоположностью функции DataBind () в ASP .NET - PullRequest
2 голосов
/ 11 сентября 2009

В настоящее время я делаю привязку данных с представлением сетки с источником данных из ArrayList. Есть ли способ отменить привязку и получить значение из вида сетки с помощью однострочного кода?

// Bind to GUI
ArrayList dsList;
gvName.DataSource = dsList;
gvName.DataBind();

// Current Way of getting code from GUI
int iRow = 0;
foreach (GridViewRow gvr in gvName.Rows)
{
    TextBox txtD1 = gvName.FindControl("textboxName") as TextBox;
    if (txtD1 != null) 
    {
        dsList[iRow].D1 = txtD1.Text;
    }
    ....
    iRow++;
}

Есть ли способ сделать это короче, как один лайнер? Есть ли у API это?

gvName.ReverseDataBind();

Ответы [ 2 ]

3 голосов
/ 12 сентября 2009

Нет такого метода в API.

Если вы заинтересованы в получении источника привязки во время создания страницы, лучший способ сделать это - сделать источник свойством уровня класса самой страницы, чтобы он был доступен в любом из методов страницы. Например:

public class MyPage: Page {
    ArrayList dsList = new ArrayList();

    ArrayList DsList {
        get {
            return this.dsList;
        }
}

Если вы заинтересованы в получении источника привязки для обратных передач (в ответ на сгенерированные клиентом события), это возможно с некоторыми уточнениями. Предполагая, что вы не хотите перестраивать источник привязки (например, путем повторного запроса к базе данных, что всегда следует учитывать), вам придется сохранить ее где-то , когда вы впервые получите его так, чтобы Вы можете получить к нему доступ позже. (Веб-элементы управления с привязкой к данным не делают этого сами.) Это может быть база данных, но иногда для удобства люди сохраняют ее в ViewState или сохраняют в Session. Оба эти подхода имеют свои опасности, и их следует использовать с осторожностью - ViewState увеличивает размер HTML-кода, отправляемого клиенту, и Session потребляет память сервера, пока она не будет явно очищена или время сеанса истекло.

0 голосов
/ 11 сентября 2009

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

Однако, если вы не можете использовать BindingList<T>, лучшее, что вы можете сделать, это извлечь элемент данных из строки:

// Bind to GUI
ArrayList dsList;
dgvName.DataSource = dsList;
dgvName.DataBind();

// Slightly simpler way of getting code from GUI
int iRow = 0;
foreach (DataGridViewRow dgvr in gvName.Rows)
{    
    object item = dgvr.DataBoundItem;        
    dsList[iRow].D1 = item.ToString();

    iRow++;
}

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

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