2010-01-04 55 views
3

如果我有兩個列表框,它們之間有一個按鈕,如果ListBox2的項目是數據綁定,如何更新ListBox2的Items?如何處理ASP.NET ListBox上的SqlDataSource的雙向綁定

<asp:ListBox runat="server" ID="ListBox1" DataSourceID="DataSource1" 
    DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" /> 

<asp:Button runat="server" ID="addButton" onClick="addButton_Click" /> 

<asp:ListBox runat="server" ID="ListBox2" DataSourceID="DataSource2" 
    DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" /> 

另外,如果我使用的SelectionMode =「多」,我將能夠使用更新的更新命令,在一次接受一個項目的數據源?

編輯:

好,添加一些澄清:

  • 兩個列表框是數據綁定到唯一的數據(的SqlDataSource)。
  • 我想從ListBox1添加項目到ListBox2,反之亦然,當用戶點擊一個按鈕。
  • 我想能夠添加多個項目到列表框(假設多選擇打開)
  • 我想要觸發一個UpdateSource的DataSource。

到目前爲止,唯一的辦法我能做到這一點是通過手動採取從第一ListBox中的每個項目並添加它作爲一個參數傳遞給數據源的更新命令和手動調用SqlDataSource.Update()方法。這有效,但這意味着我需要傳遞一個分隔字符串進行多項選擇或打開多個連接。我正在尋找的是一種更新ListBox上的DataSource的方法,一旦它完全更新,然後調用綁定/更新並將數據保存回數據庫。

+0

下面的想法會起作用嗎? 當用戶想要將值從第一個ListBox移動到第二個時,實際上會對數據庫中第二個從第二個拉入的位置執行插入操作,然後重新綁定第二個控件。 然後,如果用戶想要從第二個ListBox中刪除一個值,則在數據庫上執行刪除命令。 這種方法可以讓您保留所有其他代碼。如果將控件放入UpdatePanel中,甚至可以將項目移入和移出列表框,而無需重新加載頁面。 – 2010-01-07 21:00:46

回答

3

的第一個問題是是後添加項目您要添加的項目在綁定的DataSource之外是靜態的還是動態的。如果您想添加的項目總是相同的,如「無」選項,則可以將其作爲ListItem添加到ASP中,並將AppendToDataSource屬性設置爲True。

如果您想要動態地將值與數據綁定值一起插入,那麼您可以將DataSource值設置爲C#函數,而不設置DataSourceID。它看起來像這樣。

<asp:ListBox runat="server" ID="ListBox2" DataSource='<%# myFunc() %>' 
DataTextField="Name" DataValueField="ID" SelectionMode="Multiple" /> 
在C#

隨後的CodeFile你有

protected ListItem[] myFunc() 
     { 
      ListItem[] retVals; 

      //write your code here to get your data from DataSource2 and whatever other sources you need 

      //then create a ListItem for each row of data you want to show, 
      //set the text and the value attributes and return an array of all the values in the order you want 

      return retVals;  
     } 

這將讓你保持任何的DataBind通話功能,你可能已經開發,因爲該功能將被調用每次對象的DataBind方法叫做。

+0

這給了我一個想法,但我不知道它有什麼幫助太多我想要DataBound項目,但是當調用UI命令時,我想從單獨的源添加更多項目到原始數據,然後堅持到數據庫我已經更新了這個問題,我想我沒有很好地解釋它 – 2010-01-07 05:34:08

+0

克里斯 - 我看到你對薩姆的迴應,這也解釋了我現在很受歡迎,但我可以稍後編輯我的答案以提供更好的記錄,但我認爲你有它。可以更改DataSource屬性儘可能多地你想要的只是調用綁定()函數重新填充。只要記住,如果您在前端使用DataSourceID,那麼當您切換到後端的DataSource時,您還要清除DataSourceID屬性。 – 2010-01-07 14:15:26

0

爲ListBox2的DataBound事件添加事件處理程序。這會在SQL數據綁定之後觸發,並會給您一個添加額外數據的機會。

+0

我需要能夠點擊按鈕時添加數據。如果在ListBox1中有1,2,3和在ListBox2中有4,5,6,則用戶選擇「2」並單擊添加...我希望能夠更新ListBox2中的數據以包含「2」並讓它在DataSource上運行UpdateCommand。 – 2010-01-06 04:31:22

0

並不重要,你的列表框綁定到一個DataContext還是你不應該使用

ListBox1.Items.Add(/*your listBox Item*/);// for example if you have a person listbox you should have - ListBox1.Items.Add(new Person(1,"Nasser","Hajloo"); 

只記得你應該結合我的意思是

ListBox1.DataSource = myDBList; 
ListBox1.DataBind(); 
//some other code 
ListBox1.Items.Add(new Person(1,"Nasser","Hajloo"); 
ListBox1.DataBind(); 
+0

我試過這個,但在調用DataBind方法後,它不會調用UpdateCommand。所以數據庫沒有得到我添加的新項目。 – 2010-01-07 05:30:13

+0

添加完項後do ListBox1.Updat(); //或者validate();並且不要Databind();所以如果你想添加額外的Itm t你的數據你可以在Person class cnstructor中提供這個我以前提到過的情況,我的意思是當你新增一個Person時,你將它添加到DataBase中,如果你不喜歡添加數據庫,就像顯示它可以像我之前所說的那樣使用它,只需刪除第二行代碼(DataBinde())並讓最終的DataBind()保留。 讓我知道發生了什麼 – 2010-01-07 06:08:58

+0

這是我試圖弄清楚數據源的「只添加到數據庫」部分。我想用listbox上的數據源進行雙向綁定(在一次調用中有多個更新)。我不想在構造函數中將該項添加到數據庫中。我只想從一個數據源轉移到另一個數據源。 – 2010-01-07 06:18:03