2011-11-16 18 views
0

對於錯綜複雜的標題感到抱歉,但這是我能想到的最好的方式。如何使用GridView編輯功能修改依賴於另一個字段的字段

基本上,我有一列數據是一個URL(讓我們稱之爲URL-A),另一個是隱藏的也是URL(URL-B)。我在代碼隱藏中有一個名爲ConvertURL(string URLin)的函數,它將採用URL-A並將其轉換爲URL-B。因此,在這個gridview中,如果有人要使用本地gridview/datasource功能編輯一個條目並更改URL-A,那麼我如何通過ConvertURL()來運行這個新的URL-A,並更新URL- B字段?

下面是代碼的簡單表示(不是實際的代碼):

代碼隱藏功能:

public string ConvertURL(string URLin) 
{ 
    Int32 iLocation = URLin.IndexOf("WWW.XYZ.COM"); 
    if (iLocation >= 0) 
    { 
     string checkurl = URLin.Replace("WWW.XYZ.COM", "STAGING.XYZ.COM"); 
     return checkurl; 
    } 
    else 
    { 
     return URLin; 
    } 
} 

數據源:

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:My_AppConnectionString %>" 
    SelectCommand="SELECT [URL_A], [URL_B], [URLName] FROM [My_App] WHERE ([IsActive] = @IsActive)" 
     OldValuesParameterFormatString="original_{0}" 
     UpdateCommand="UPDATE [My_App] SET [URL_A] = @URL_A, [URL_B] = @URL_B, [URLName] = @URLName, [IsActive] = @IsActive WHERE [ID] = @original_ID"> 
     <SelectParameters> 
      <asp:Parameter DefaultValue="True" Name="IsActive" Type="Boolean" /> 
     </SelectParameters> 
     <UpdateParameters> 
      <asp:Parameter Name="URL_A" Type="String" /> 
      <asp:Parameter Name="URL_B" Type="String" /> 
      <asp:Parameter Name="URLName" Type="String" /> 
      <asp:Parameter Name="IsActive" Type="boolean" /> 
      <asp:Parameter Name="original_ID" Type="Int32" /> 
      <asp:Parameter Name="original_URL_A" Type="String" /> 
      <asp:Parameter Name="original_URL_B" Type="String" /> 
      <asp:Parameter Name="original_URLName" Type="String" /> 
     </UpdateParameters> 
</asp:SqlDataSource> 

最後GridView:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
     onrowediting="GridView1_RowEditing" 
     AutoGenerateColumns="False" CellPadding="3" DataKeyNames="ID" 
     DataSourceID="SqlDataSource1" EnableModelValidation="False" ForeColor="Black" 
     GridLines="Vertical" AllowSorting="True" BackColor="White" 
     BorderColor="#999999" BorderStyle="Solid" BorderWidth="1px" 
     AutoGenerateEditButton="True" CausesValidation="false"> 
     <AlternatingRowStyle BackColor="#CCCCCC" /> 
     <Columns> 
      <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
       ReadOnly="True" SortExpression="ID" Visible="False" /> 
      <asp:BoundField DataField="URL_A" HeaderText="URL A" 
       SortExpression="URL_A" /> 
      <asp:BoundField DataField="URL_B" HeaderText="URL B" 
       SortExpression="URL_B" **Visible="False"** /> 
      <asp:BoundField DataField="URLName" HeaderText="URL Name" 
       SortExpression="URLName" /> 
      <asp:CheckBoxField DataField="IsActive" HeaderText="Active" 
       SortExpression="IsActive" /> 
     </Columns> 
     <FooterStyle BackColor="#CCCCCC" /> 
     <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" /> 
     <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" /> 
     <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" /> 
    </asp:GridView> 

所以總結一下:用戶會看到一個帶有3個字段的GridView,其中一個是URL_A(URL_B被隱藏)。當他們點擊編輯並更新URL_A字段時,我想通過ConvertURL()函數運行URL_A,並在執行更新時使用該輸出作爲URL_B的數據。

我很感謝提前的幫助!

回答

1

使用網格視圖的RowUpdating event並更改URL_B的新值。在這種情況下,您將擁有該行的舊值以及新值的access。您可以在將新值發送到實際更新的數據源之前更改這些值。

事件處理程序添加到網格視圖的ASPX:

<asp:GridView ID="GridView1" runat="server" 
    ... 
    OnRowUpdating="GridView1_RowUpdating"> 

並在代碼文件處理該事件:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e) 
{ 
    // Find the current value for URL_A 
    string urlA = (string)e.NewValues["URL_A"]; 
    // Get the corresponding value for URL_B from the method 
    string urlB = ConvertURL(urlA); 
    // Set the new value for the URL_B column before it's sent to the SqlDataSource 
    e.NewValues["URL_B"] = urlB; 
} 
+0

大,謝謝!這正是我想弄明白的。 – jethomas

相關問題