2009-05-07 13 views
23

पर गतिशील बाध्यकारी मैं प्रदर्शित होने पर स्ट्रिंग के रूप में चयनित मान दिखाने के लिए एक एएसपी.NET 3.5 ग्रिड व्यू प्राप्त करने का प्रयास कर रहा हूं, और ड्रॉपडाउनलिस्ट को दिखाने के लिए मुझे किसी दिए गए मान से मूल्य चुनने की अनुमति देने के लिए संपादित किए जाने पर विकल्पों की सूची। काफी सरल लगता है?ग्रिडव्यू पंक्ति संपादन - ड्रॉपडाउनलिस्ट

मेरे gridview की तरह इस (सरलीकृत) दिखता है:

<asp:GridView ID="grvSecondaryLocations" runat="server" 
       DataKeyNames="ID" OnInit="grvSecondaryLocations_Init" 
       OnRowCommand="grvSecondaryLocations_RowCommand" 
       OnRowCancelingEdit="grvSecondaryLocations_RowCancelingEdit" 
       OnRowDeleting="grvSecondaryLocations_RowDeleting" 
       OnRowEditing="grvSecondaryLocations_RowEditing" 
       OnRowUpdating="grvSecondaryLocations_RowUpdating" > 
<Columns> 
    <asp:TemplateField> 
     <ItemTemplate> 
       <asp:Label ID="lblPbxTypeCaption" runat="server" 
           Text='<%# Eval("PBXTypeCaptionValue") %>' /> 
     </ItemTemplate> 
     <EditItemTemplate> 
         <asp:DropDownList ID="ddlPBXTypeNS" runat="server" 
           Width="200px" 
           DataTextField="CaptionValue" 
           DataValueField="OID" /> 
     </EditItemTemplate> 
    </asp:TemplateField> 
</asp:GridView> 

ग्रिड ठीक से प्रदर्शित हो जाता है जब नहीं संपादन मोड में - चयनित पीबीएक्स प्रकार एएसपी में अपने मूल्य पता चलता है: लेबल नियंत्रण। वहां कोई आश्चर्य नहीं है।

मैं ड्रॉपडाउनलिस्ट के लिए _pbxTypes नामक स्थानीय सदस्य में फॉर्म की घटना को OnLoad ईवेंट में लोड करता हूं। मैंने यह सत्यापित किया - यह काम करता है, मूल्य वहां हैं।

अब मेरी चुनौती है: जब ग्रिड किसी विशेष पंक्ति के लिए संपादन मोड में जाता है, तो मुझे _pbxTypes में संग्रहीत पीबीएक्स की सूची को बांधना होगा।

काफी सरल है, मैंने सोचा - बस RowEditing घटना में सूची वस्तु ड्रॉप डाउन हड़पने और सूची संलग्न:

protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    GridViewRow editingRow = grvSecondaryLocations.Rows[e.NewEditIndex]; 

    DropDownList ddlPbx = (editingRow.FindControl("ddlPBXTypeNS") as DropDownList); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 

मुसीबत है - मैं कभी नहीं FindControl कॉल से वापस कुछ भी - ddlPBXTypeNS की तरह लगता है मौजूद नहीं है (या नहीं मिला)।

मुझे क्या याद आ रही है ?? वास्तव में कुछ बेवकूफ होना चाहिए .... लेकिन अब तक, मेरे सभी गुगलिंग, ग्रिड व्यू नियंत्रणों पर पढ़ना, और दोस्तों से पूछने में मदद नहीं मिली है।

गायब लिंक को कौन देख सकता है? ;-)

उत्तर

27

काफी आसान ... तुम क्योंकि उस घटना से नियंत्रण वहाँ नहीं है, गलत कर रहे हैं:

protected void gv_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow && 
     (e.Row.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
    { 
     // Here you will get the Control you need like: 
     DropDownList dl = (DropDownList)e.Row.FindControl("ddlPBXTypeNS"); 
    } 
} 

है, यह केवल एक के लिए मान्य होगा DataRow (डेटा के साथ वास्तव में पंक्ति), और यदि यह में मोड संपादित करें ... क्योंकि आप एक समय में केवल एक पंक्ति संपादित करते हैं। e.Row.FindControl("ddlPBXTypeNS") केवल वही नियंत्रण मिलेगा जो आप चाहते हैं।

+1

ट्रिकी .... मुझे यह घटना मिलती है, लेकिन रोस्टस्टेट "वैकल्पिक | संपादन" है - इसलिए आपका IF कभी भी सत्य नहीं है :-) –

+0

ठीक है, मैंने "संपादित करें" बिट सेट करने के लिए जांचने के लिए अपना बदल दिया (सेट किए जा सकने वाले किसी भी अन्य बिट्स को अनदेखा कर सकते हैं) और अब यह एक आकर्षण की तरह काम करता है! धन्यवाद एक ढेर !! –

+0

सिर्फ कोड :) – balexandre

1

मैं 3.5 में ग्रिड व्यू के बजाय एक सूची दृश्य का उपयोग कर रहा हूं। जब उपयोगकर्ता संपादित करना चाहता है तो मैंने रिकॉर्ड के लिए उस कॉलम के ऊपरी मूल्य पर ड्रॉपडाउन के चयनित आइटम को सेट किया है। मैं ItemDataBound घटना में ड्रॉपडाउन तक पहुंचने में सक्षम हूं। कोड यह रहा:

protected void listViewABC_ItemDataBound(object sender, ListViewItemEventArgs e) 
{ 
    // This stmt is used to execute the code only in case of edit 
    if (((ListView)(sender)).EditIndex != -1 && ((ListViewDataItem)(e.Item)).DisplayIndex == ((ListView)(sender)).EditIndex) 
    { 
     ((DropDownList)(e.Item.FindControl("ddlXType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).XTypeId.ToString(); 
     ((DropDownList)(e.Item.FindControl("ddlIType"))).SelectedValue = ((MyClass)((ListViewDataItem)e.Item).DataItem).ITypeId.ToString(); 
    } 
} 
+0

यह एक सूची एक GridView नहीं है है! – balexandre

+0

बिल्कुल - और मैं वास्तव में इसे काम करने के लिए इसे बदलना नहीं चाहता, अगर कभी भी संभव हो ..... धन्यवाद वैसे भी! –

+1

balexandre ... मैंने पहले ही इसका ग्रिडव्यू नहीं बताया है ... यह सिर्फ एक एफवाईआई नहीं था ... यह बेहतर होगा अगर आप लोगों को 'अन्य उत्तरों' के बजाय 'गलत उत्तरों' के लिए अंक देना सीखें या fyis ' –

0

आप SelectedValue उपयोग कर सकते हैं:

<EditItemTemplate> 
    <asp:DropDownList ID="ddlPBXTypeNS" 
         runat="server" 
         Width="200px" 
         DataSourceID="YDS" 
         DataTextField="CaptionValue" 
         DataValueField="OID" 
         SelectedValue='<%# Bind("YourForeignKey") %>' /> 
    <asp:YourDataSource ID="YDS" ...../> 
</EditItemTemplate> 
1
protected void grvSecondaryLocations_RowEditing(object sender, GridViewEditEventArgs e) 
{ 
    grvSecondaryLocations.EditIndex = e.NewEditIndex; 

    DropDownList ddlPbx = (DropDownList)(grvSecondaryLocations.Rows[grvSecondaryLocations.EditIndex].FindControl("ddlPBXTypeNS")); 
    if (ddlPbx != null) 
    { 
     ddlPbx.DataSource = _pbxTypes; 
     ddlPbx.DataBind(); 
    } 

    .... (more stuff) 
} 
0

जाँच answer from balexandre महान काम करता है। लेकिन, अगर कुछ अन्य परिस्थितियों में अनुकूलित किया गया तो यह एक समस्या पैदा करेगा।

मैं इसे इस्तेमाल किया दो लेबल नियंत्रण के मान बदलने के लिए - lblEditModifiedBy और lblEditModifiedOn - जब मैं एक पंक्ति को संपादित किया गया था, ताकि सही ModifiedBy और ModifiedOn पर 'अपडेट करें' डाटाबेस को बचा लिया जाएगा।

जब मैंने RowUpdating ईवेंट में 'अपडेट' बटन पर क्लिक किया, तो उसने OldValues सूची में दर्ज किए गए नए मान दिखाए।डेटाबेस को अद्यतन करते समय मुझे मूल "मानों" के रूप में वास्तविक "मानों की आवश्यकता होती है। (वहाँ एक ObjectDataSourceGridView से जुड़ी है।)

इस को ठीक gv_DataBound घटना में balexandre के कोड का उपयोग कर रहा है, लेकिन संशोधित रूप में:

protected void gv_DataBound(object sender, EventArgs e) 
{ 
    foreach (GridViewRow gvr in gv.Rows) 
    { 
     if (gvr.RowType == DataControlRowType.DataRow && (gvr.RowState & DataControlRowState.Edit) == DataControlRowState.Edit) 
     { 
      // Here you will get the Control you need like: 
      ((Label)gvr.FindControl("lblEditModifiedBy")).Text = Page.User.Identity.Name; 
      ((Label)gvr.FindControl("lblEditModifiedOn")).Text = DateTime.Now.ToString(); 
     } 
    } 
} 
-1
<asp:GridView ID="GridView1" runat="server" PageSize="2" AutoGenerateColumns="false" 
      AllowPaging="true" BackColor="White" BorderColor="#CC9966" BorderStyle="None" 
      BorderWidth="1px" CellPadding="4" OnRowEditing="GridView1_RowEditing" OnRowUpdating="GridView1_RowUpdating" 
      OnPageIndexChanging="GridView1_PageIndexChanging" OnRowCancelingEdit="GridView1_RowCancelingEdit" 
      OnRowDeleting="GridView1_RowDeleting"> 
      <FooterStyle BackColor="#FFFFCC" ForeColor="#330099" /> 
      <RowStyle BackColor="White" ForeColor="#330099" /> 
      <SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="#663399" /> 
      <PagerStyle BackColor="#FFFFCC" ForeColor="#330099" HorizontalAlign="Center" /> 
      <HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="#FFFFCC" /> 
      <Columns> 
      <asp:TemplateField HeaderText="SerialNo"> 
      <ItemTemplate> 
      <%# Container .DataItemIndex+1 %>.&nbsp 
      </ItemTemplate> 
      </asp:TemplateField> 
       <asp:TemplateField HeaderText="RollNo"> 
        <ItemTemplate> 
         <%--<asp:Label ID="lblrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtrollno" runat="server" Text='<%#Eval ("RollNo")%>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="SName"> 
        <ItemTemplate> 
        <%--<asp:Label ID="lblsname" runat="server" Text='<%#Eval("SName")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtsname" runat="server" Text='<%#Eval("SName")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="C"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblc" runat="server" Text='<%#Eval ("C") %>'></asp:Label>--%> 
         <asp:TextBox ID="txtc" runat="server" Text='<%#Eval ("C") %>'></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Cpp"> 
        <ItemTemplate> 
        <%-- <asp:Label ID="lblcpp" runat="server" Text='<%#Eval ("Cpp")%>'></asp:Label>--%> 
         <asp:TextBox ID="txtcpp" runat="server" Text='<%#Eval ("Cpp")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Java"> 
        <ItemTemplate> 
         <%-- <asp:Label ID="lbljava" runat="server" Text='<%#Eval ("Java")%>'> </asp:Label>--%> 
         <asp:TextBox ID="txtjava" runat="server" Text='<%#Eval ("Java")%>'> </asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:TemplateField HeaderText="Edit" ShowHeader="False"> 
        <EditItemTemplate> 
         <asp:LinkButton ID="lnkbtnUpdate" runat="server" CausesValidation="true" Text="Update" 
          CommandName="Update"></asp:LinkButton> 
         <asp:LinkButton ID="lnkbtnCancel" runat="server" CausesValidation="false" Text="Cancel" 
          CommandName="Cancel"></asp:LinkButton> 
        </EditItemTemplate> 
        <ItemTemplate> 
         <asp:LinkButton ID="btnEdit" runat="server" CausesValidation="false" CommandName="Edit" 
          Text="Edit"></asp:LinkButton> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:CommandField HeaderText="Delete" ShowDeleteButton="True" ShowHeader="True" /> 
       <asp:CommandField HeaderText="Select" ShowSelectButton="True" ShowHeader="True" /> 
      </Columns> 
     </asp:GridView> 
     <table> 
      <tr> 
       <td> 
        <asp:Label ID="lblrollno" runat="server" Text="RollNo"></asp:Label> 
        <asp:TextBox ID="txtrollno" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblsname" runat="server" Text="SName"></asp:Label> 
        <asp:TextBox ID="txtsname" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblc" runat="server" Text="C"></asp:Label> 
        <asp:TextBox ID="txtc" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lblcpp" runat="server" Text="Cpp"></asp:Label> 
        <asp:TextBox ID="txtcpp" runat="server"></asp:TextBox> 
       </td> 
       <td> 
        <asp:Label ID="lbljava" runat="server" Text="Java"></asp:Label> 
        <asp:TextBox ID="txtjava" runat="server"></asp:TextBox> 
       </td> 
      </tr> 
      <tr> 
       <td> 
        <asp:Button ID="Submit" runat="server" Text="Submit" OnClick="Submit_Click" /> 
        <asp:Button ID="Reset" runat="server" Text="Reset" OnClick="Reset_Click" /> 
       </td> 
      </tr> 
     </table> 
+2

के लिए इसे समझने की कोशिश कर रहा है StackOverflow में आपका स्वागत है: यदि आप कोड, एक्सएमएल या डेटा नमूने पोस्ट करते हैं, ** कृपया ** टेक्स्ट एडिटर में उन पंक्तियों को हाइलाइट करें और संपादक टूलबार पर "कोड नमूने" बटन ('{}') पर क्लिक करें ताकि इसे अच्छी तरह से प्रारूपित और सिंटैक्स हाइलाइट किया जा सके! –

संबंधित मुद्दे