2012-06-11 3 views
4

У меня есть ListBox с набором значений, и я хотел бы обновить его, если данные будут добавлены/удалены.asp.net Обновление ListBox

Следующие работы, но есть ли способ не называть это каждый раз, когда вы изменяете содержимое?

lbUsers.DataSource = myDataSource; 
lbUsers.DataBind(); 
+0

Как вы знаете, что данные были изменены, и что тип 'myDataSource'? –

+0

Источник данных исходит из хранимой процедуры в БД и ее набора в! IsPostBack. Я не против использования .DataSource и .DataBind (это происходит только в 2-х местах) Мне просто интересно, есть ли способ просто называть его один раз. –

ответ

0

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

+0

Является ли 'BindingList ' avialable для 'asp.net'? –

1

Да, вы не обязательно должны использовать источник данных, если вы хотите, чтобы добавить элемент в явной форме:

lbUsers.Items.Add(new ListItem("New Item", "NI")); 
+0

будет ли список обновляться сразу? – Bastardo

+0

Пока этот код выполняется как часть обратной передачи страницы, новый элемент будет виден, когда он загрузится, да.Вы можете добавить элемент клиента, но тогда он не будет «видимым» для серверного кода. – Widor

1

Я хотел бы получить его обновить, если данные добавляется/удаляется к нему

Это все зависит от вида пользовательского интерфейса.

Является ли точка страницы для добавления пользователей и отображать их по мере их добавления? Или директива страницы отображает всех доступных в настоящее время пользователей до второго?

Если ваша цель первая, вы просто будете перегруппировать ListBox каждый раз, когда пользователь будет добавлен.

Вот пример первой ситуации ниже:

Добавить пользователя и отобразят

Markup

<asp:TextBox ID="txtUsername" runat="server" /> 
<asp:Button ID="btAdd" runat="server" value="Add" onclick="btAdd_Click" /> 
<asp:ListBox ID="lbUsers" runat="sever" /> 

Code-за

public void AddUser() 
{ 
    string username = txtUsername.Text; 

    // Either update the database with a new user 
    User newUser = User(username); 
    WhateverDataAccessYoureUsing.Add(User); 
    List<User> users = WhateverDataAccessYoureUsing.GetAllUsers(); 
    lbUsers.DataSource = users; 
    lbUsers.DataBind(); 

    // OTHER OPTION 
    // 
    // Or if no database directly bind the user to the ListBox 
    ListItem li = new ListItem(username); 
    lbUsers.Items.Add(li); 
} 

protected void btAdd_Click(object sender, EventArgs e) 
{ 
    AddUser(); 
} 

Однако, если страница представляет собой просто отображение всех пользователей и отображение новых, поскольку они созданы в другом месте, то вам нужна комбинацияи код на стороне сервера. Вместо использования серверного элемента управления мы будем использовать выбор HTML, потому что невозможно получить доступ к элементам управления сервером в WebMethods. Кроме того, мы будем использовать jQuery для выполнения вызовов AJAX.

Отображение пользователей с помощью AJAX звонки

размечать

<select id="lbUsers" size="4" multiple="multiple"> 
</select> 

<script> 
    // When the page is ready to be manipulated 
    $(function() { 

     // Call the server every three seconds to get an updated list of users 
     setInterval(function() { 

      $.ajax({ 
       type: "POST", 
       url: "Default.aspx/GetUsers", 
       contentType: "application/json; charset=utf-8", 
       dataType: "json", 
       success: function (result) { 
        // If we are successful, append the results to lbUser 
        $(result.d).appendTo('#lbUser').hide().fadeIn(500); 
       }, 
       error: function() { 
        // If we encounter an error, alert the user 
        alert("There was a problem getting the new users"); 
       } 
      }); 

     },3000); // 3000 is 3000 milliseconds which is 3 seconds 
    }); 
</script> 

Code-за

// This annotation is required for all methods that can be accessed via AJAX calls 
[System.Web.Services.WebMethod] 
public static void GetUsers() 
{ 
    List<User> users = WhateverDataAccessYoureUsing.GetAllUsers(); 

    string listItems = string.Empty; 

    // Loop through the list of users and create the option 
    // that will be displayed inside of lbUsers 
    foreach (User u in users) 
    { 
     listItems += CreateOption(u.Username); 
    } 

    // return the string value that will be appended on to lbUsers 
    return listItems; 
} 

// This creates the html options that will be displayed 
// inside of lbUser 
private string CreateOption(string text) 
{ 
    string option = "<option>" + text + "</option>" 
} 
Смежные вопросы