Editing with Advance Controls – GridView Templates

Editing with Advance Controls – Template Based Editing उस स्थिति में और भी उपयोगी साबित होता है, जब हम List जैसे Advance Controls को Use करते हुए Editing करना चाहते हैं।

उदाहरण के लिए यदि हम चाहें, तो अपने पिछले Example में TitleOfCourtesy Field को एक Drop-Down List Control का प्रयोग करते हुए Advance Editing के लिए Available करवा सकते हैं और ये काम करने के लिए हमें EditItemTemplate को निम्न Example के अनुसार Modify करना होता है:

[code]
File Name: Test.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="GridView.Test" %>
<!DOCTYPE html>
<script runat="server">
    protected string[] TitlesOfCourtesy
    {
        get { return new string[] { "Mr.", "Dr.", "Ms.", "Mrs." }; }
    }
    protected int GetSelectedTitle(object title)
    {
        return Array.IndexOf(TitlesOfCourtesy, title.ToString());
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:SqlDataSource
        ID="sourceEmployee" runat="server"
        ConnectionString="<%$ ConnectionStrings:Northwind %>"
        SelectCommand="SELECT * FROM [Employees]"
        UpdateCommand=
          "UpdateCommand=&quot;UPDATE Employees SET Notes=@Notes
            WHERE EmployeeID=@EmployeeID&quot;"
        ></asp:SqlDataSource>
        <br />
        <asp:GridView
        ID="GridView1" runat="server" AutoGenerateColumns="False"
        DataSourceID="sourceEmployee" DataKeyNames="EmployeeID"
        AutoGenerateEditButton="True"
       >
            <Columns>
                <asp:CommandField ShowSelectButton="True" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <b>
                            <%# Eval("EmployeeID") %> -
                            <%# Eval("TitleOfCourtesy") %> <%# Eval("FirstName") %>
                            <%# Eval("LastName") %>
                        </b>
                        <hr />
                        <small>
                            <i>
                                <%# Eval("Address") %><br />
                                <%# Eval("City") %>, <%# Eval("Country") %>,
                                <%# Eval("PostalCode") %><br />
                                <%# Eval("HomePhone") %>
                            </i>
                            <br /><br />
                            <%# Eval("Notes") %>
                        </small>
                    </ItemTemplate>
                    <EditItemTemplate>
                        <b>
                            <%# Eval("EmployeeID") %> -
                            <asp:DropDownList runat="server" ID="EditTitle"
                            SelectedIndex='<%# GetSelectedTitle(Eval("TitleOfCourtesy")) %>'
                            DataSource='<%# TitlesOfCourtesy %>'
                    />
                            <%# Eval("FirstName") %>
                            <%# Eval("LastName") %>
                        </b>
                        <hr />
                        <small>
                            <i>
                                <%# Eval("Address") %><br />
                                <%# Eval("City") %>, <%# Eval("Country") %>,
                                <%# Eval("PostalCode") %><br />
                                <%# Eval("HomePhone") %>
                            </i>
                        <br /><br />
                        <asp:TextBox
                      runat="server" id="textBox"
                      Text='<%# Bind("Notes") %>'
                      TextMode="MultiLine" Width="413px"
                   />
                        </small>
                        </EditItemTemplate>
                    </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </div>
    </form>
</body>
</html>
[/code]

जब हम इस बार इस Example को Run करके Record को Edit करते हैं, तो इस बार हमें निम्नानुसार Advance Editing Feature प्राप्त होता है, जिसमें एक Drop-Down List Control Included है:

Editing with Advance Controls - GridView Templates - ASP.NET in Hindi

इस Example में हमने निम्नानुसार Code के माध्‍यम से EditItemTemplate Specify किया है:

[code]
  <%# Eval("EmployeeID") %> -
   <asp:DropDownList runat="server" ID="EditTitle"
     SelectedIndex='<%# GetSelectedTitle(Eval("TitleOfCourtesy")) %>'
     DataSource='<%# TitlesOfCourtesy %>'
  />
   <%# Eval("FirstName") %>
   <%# Eval("LastName") %>
[/code]

इस जब इस Webpage में हम किसी Record की Editing करते हैं, तो TitleOfCourtesy Field के Data हमें एक Drop-Down List में दिखाई देते हैं। इस Example में हमने DropDownList.DataSource Property में एक Data Binding Expression को Specify किया है, जो कि एक Custom Property को Point करता है। फिर ये Custom Property, एक Suitable Data Source को विभिन्न Available Courtesy की List में से Return करता है। जबकि विभिन्न Courtesies को निम्नानुसार Code के माध्‍यम से TitlesOfCourtesy नाम के Array के रूप में Specify किया गया है:

[code]
    protected string[] TitlesOfCourtesy
    {
        get { return new string[] { "Mr.", "Dr.", "Ms.", "Mrs." }; }
    }
[/code]

हम समझ सकते हैं कि ये Courtesy List किसी भी लिहाज से Complete नहीं है और इसमें Miss, Lord, Lady, Sir, None जैसे और Items को Add किया जा सकता है।

हालांकि ये Step इस बात को निश्चित कर देता है कि किन Courtesies को उपयोग में लिया जा सकता है, लेकिन अभी तक इस बात का पता नहीं चलता कि किस Record के लिए किस Courtesy को Use किया गया है।

इसलिए यहां Best Approach के रूप में हम SelectedIndex Property को एक Custom Method के साथ Bind कर सकते हैं जो कि Current Title को Accept करता है और उस Selected Record के Index को Return करता है।

इस उदाहरण के हमने GetSelectedTitle() नाम के Method को इसी जरूरत को पूरा करने के लिए निम्नानुसार Define किया है:

[code]
    protected int GetSelectedTitle(object title)
    {
        return Array.IndexOf(TitlesOfCourtesy, title.ToString());
    }
[/code]

ये Method Input के रूप में Title को Accept करता है और Return Value के रूप में उस Title को TitlesOfCourtesy Array में Find करके उसका Index Number Return करता है, जबकि Appropriate Title की Searching के लिए इस Method में Array.IndexOf() Method को Use किया गया है।

साथ ही यहां ध्‍यान देने वाली बात ये है कि हमें हमारे Title को String Value के रूप में Manually Cast करना जरूरी होता है, इसीलिए हमने इस Method में title.ToString() Statement का प्रयोग किया है। क्‍योंकि DataBinder.Eval() Method हमेंशा एक object Type का Object Return करता है, न कि string Type का String, इसलिए इस Method में Parameter के रूप में Pass होने वाला Argument एक object Type का Argument होता है।

हालांकि हमारा ये Example काफी हद तक Normal काम करता है, लेकिन अभी भी ये Complete नहीं है। क्‍योंकि अब हमारे पास एक ऐसा Listbox है, जो कि Edit Mode में Automatically Selected Correct Item से Populate होता है। लेकिन यदि हम Selection को Change करते हैं, तो Values Underlying Data Source पर Automatically Sent Back नहीं होतीं।

इसलिए इस उदाहरण में इस समस्या से छुटकारा पाने के लिए हम Bind() Method को SelectedValue Property के साथ Use कर सकते हैं, क्‍योंकि जो Text Control में होता है, Exactly वही Text Record में Save होने के लिए Underlying Database में Commit होता है।

लेकिन कई बार स्थिति इतनी आसान नहीं होती क्‍योंकि हमें Updating के लिए Commit होने वाली Values को Different Database Representation के अनुसार Translate करना पडता है। इस स्थिति में केवल एक ही Solution होता है कि हम RowUpdating Event को Handle करें, Current Row में List Control को Find करें और Text को Execute करें। उसके बाद हम Extra Properties को Dynamically Add कर सकते हैं, जैसाकि निम्न Handler में किया गया है:

[code]
protected void GridView1_RowUpdating (object sender, GridViewUpdateEventArgs e)
{
    // Get the reference to the list control.
    DropDownList title = (DropDownList)
    (GridView1.Rows[e.RowIndex].FindControl("EditTitle"));

    // Add it to the parameters.
    e.NewValues.Add("TitleOfCourtesy", title.Text);
}
[/code]

इस Method को Define करने के साथ ही हमें हमारे SqlDataSource Control को निम्नानुसार Modify करते हुए उसमें @TitleOfCourtesy Parameter को भी Use करना होता है:

[code]
UpdateCommand="UPDATE Employees
  SET Notes=@Notes, TitleOfCourtesy=@TitleOfCourtesy
     WHERE EmployeeID=@EmployeeID"
[/code]

अपने उपरोक्त Example में इन Modifications को Perform करने के बाद अब यदि हम Notes TitleOfCourtesy दोनों Fields को Edit करके Update करते हैं, तो बिना किसी परेशानी के अब हमारा Editing, Underlying Database में Commit हो जाता है।

इस तरह से हम समझ सकते हैं कि Editable Templates का प्रयोग करके हमें हमारे Output को काफी बेहतर तरीके से Control कर सकते हैं, जो कि Auto-Generated Codes द्वारा सम्भव नहीं होता। लेकिन क्‍योंकि ये तरीका ज्यादातर Manual Coding पर आधारित है, इसलिए ये तरीका उतना Fast नहीं होता, जितना Auto-Generated Fields को Use करने वाला तरीका होता है।

Advance ASP.NET WebForms with C# in Hindi - BccFalna.com: TechTalks in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook Advance ASP.NET WebForms with C# in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।

Advance ASP.NET WebForms in Hindi | Page:707 | Format: PDF

BUY NOW GET DEMO REVIEWS