2011-09-07 15 views
5

मेरे पास एक ग्रिडव्यू है जिसमें प्रत्येक पंक्ति में ड्रॉपडाउन सूची होती है। मैं गतिशील रूप से हर ड्रॉपडाउन सूची को बांधना चाहता हूं। क्या कोई मुझे बता सकता है कि मैं इसे कैसे कर सकता हूं। अग्रिमग्रिडव्यू में ड्रॉपडाउन सूची कैसे बांधें?

उत्तर

14

यदि आप टेम्पलेट कॉलम का उपयोग कर रहे हैं तो आप डेटा-बाध्यकारी अभिव्यक्तियों का उपयोग करके मार्क-अप से अपने ड्रॉप-डाउन को बाध्य कर सकते हैं। उदाहरण के लिए,

<asp:TemplateField HeaderText="XYZ"> 
    <ItemTemplate> 
    <asp:DropDownList runat="server" ID="MyDD" DataSourceId="MyDataSource" /> 
    </ItemTemplate> 
</asp:TemplateField> 

ऊपर यह मानते हुए कि पंक्तियों में लगातार आपका ड्रॉप-डाउन डेटा है। यह बदल रहा है, तो आप इस तरह के

<asp:DropDownList runat="server" DataSource='<%# GetDropDownData(Container) %>' DataTextField="Text" DataValueField="Value" /> 

के रूप में डेटा-बाइंडिंग अभिव्यक्ति का उपयोग GetDropDownData कोड-पीछे में एक संरक्षित विधि उस पंक्ति का डेटा (डेटा-तालिका, सूची, सरणी) वापस आ जाएगी हो जाएगा कर सकते हैं।

आप ड्रॉप-डाउन भरने के लिए कोड-पीछे में GridView.RowDataBound ईवेंट (या रोक्रेटेड ईवेंट) का उपयोग कर सकते हैं। उदाहरण के लिए,

protected void GridView_RowDataBound(Object sender, GridViewRowEventArgs e) 
    { 

    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // Find the drop-down (say in 3rd column) 
     var dd = e.Row.Cells[2].Controls[0] as DropDownList; 
     if (null != dd) { 
     // bind it 
     } 

     /* 
     // In case of template fields, use FindControl 
     dd = e.Row.Cells[2].FindControl("MyDD") as DropDownList; 
     */ 
    } 

    } 
+0

RowCreated घटना के बारे में क्या होगा? क्या एक दूसरे को पसंद करने का कोई कारण होगा? – Tim

+0

@ टिम, रोक्रेटेड भी काम करेगा। हालांकि, मेरा मानना ​​है कि यदि आप केवल पहली बार ग्रिड को बाध्य कर रहे हैं (और पोस्ट-बैक पर नहीं), तो 'रोक्रेटेड' निश्चित रूप से प्रत्येक पोस्ट-बैक पर आग लग जाएगी, लेकिन 'रोडाटाबाउंड' नहीं है (मैं यहां 100% निश्चित नहीं हूं)। तो ऐसे मामले में, हम भरने के लिए ड्रॉप-डाउन पाने के लिए दृश्य-स्थिति पर भरोसा कर सकते हैं। निजी तौर पर, मैं मार्कअप मार्ग पसंद करता हूं। – VinayC

+0

यह माना जाता है कि आपके कोड में आपका SQL इंस्टेंस घोषित किया गया है। यदि आप पहले से ही अपने कोड में अपने ग्रिड व्यू को बाध्य करते हैं तो एक अलग समाधान होना आवश्यक है, क्योंकि आप मार्कअप के माध्यम से ऐसा करने के लिए उदाहरण देने के लिए DataSourceId = "MyDataSource" –

15

प्रस्तावित तरीकों के अलावा, आप भी अपने नियंत्रण अपने मार्कअप के भीतर बाँध सकता है, इस तरह से:

<asp:GridView ID="MyGrid" runat="server" DataSourceID="MyDataSource1"> 
    <Columns> 
     <asp:TemplateField> 
      <EditItemTemplate> 
       <asp:DropDownList ID="DropDownList1" runat="server" SelectedValue='<%# Bind ("CustomerId") %>' DataSourceID="CustomersDataSource" DataTextField="CustomerName" DataValueField="CustomerId" > 
       </asp:DropDownList> 
      </EditItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 
+1

+1 का उपयोग करने में सक्षम नहीं होंगे :) – Tim

+1

@Tim : धन्यवाद :) –

+1

@Efran यह मेरे मुद्दे के लिए काम किया। धन्यवाद। – htm11h

-1
protected void gvSalesAppData_RowDataBound(Object sender, GridViewRowEventArgs e) 

    { 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 

      DropDownList ddlCurrentPhase = (DropDownList)e.Row.FindControl("ddlCurrentPhase"); 
      DropDownList ddlProductFamily = (DropDownList)e.Row.FindControl("ddlProductFamily"); 
      DropDownList ddlProductGroup = (DropDownList)e.Row.FindControl("ddlProductGroup"); 
      DropDownList ddlETProgramManager = (DropDownList)e.Row.FindControl("ddlETProgramManager"); 
      DropDownList ddlPLMForTheProduct = (DropDownList)e.Row.FindControl("ddlPLMForTheProduct"); 

      TrackingToolObj.BindCurrentPhases(ddlCurrentPhase); 
      TrackingToolObj.BindCurrentPhases(ddlProductFamily); 
      TrackingToolObj.BindProductGroups(ddlProductGroup); 
      TrackingToolObj.GetEmployeesBasedOnRoleTypeId(ddlETProgramManager, (int)OSAEnums.RoleTypes.ProgramManager, false); 
      TrackingToolObj.GetEmployeesBasedOnRoleTypeId(ddlPLMForTheProduct, (int)OSAEnums.RoleTypes.PLM, false); 


     } 

    } 
-2

GridView

बाइंडिंग नीचे है डेटा के साथ ग्रिड व्यू नियंत्रण को बांधने के लिए कोड।

सी #

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
    this.BindData(); 
    } 
} 

private void BindData() 
{ 
    string query = "SELECT top 10 * FROM Customers";  
    SqlCommand cmd = new SqlCommand(query);  
    gvCustomers.DataSource = GetData(cmd);  
    gvCustomers.DataBind(); 
} 

private DataTable GetData(SqlCommand cmd) 
{  
    string strConnString = ConfigurationManager.ConnectionStrings["conString"].ConnectionString;  
    using (SqlConnection con = new SqlConnection(strConnString)) 
    {   
     using (SqlDataAdapter sda = new SqlDataAdapter())  
     {    
      cmd.Connection = con;    
      sda.SelectCommand = cmd;    
      using (DataTable dt = new DataTable()) 
      {     
       sda.Fill(dt);     
       return dt; 
      }  
     } 
    } 
} 
+0

कृपया अपना उत्तर संपादित करें और इसे पढ़ने योग्य बनाने के लिए कोड को प्रारूपित करें – kleopatra

+2

ईमानदार होने के लिए, यह करने का एक कठिन तरीका है। यदि आपके पास ग्रिडव्यू में 500 पंक्तियां हैं, तो आप 500 बार डेटाबेस पूछने जा रहे हैं? जब मुझे ऐसा करना है, तो मैं ड्रॉप डाउन सूची में आइटम्स के डेटा के साथ डेटासेट भरता हूं और जैसा कि ऊपर दिखाया गया है, RowDataBound ईवेंट में, डेटासेट को ड्रॉपडाउन सूची में बाध्य करें। –

1

यहाँ अपने gridview

<asp:GridView ID="grvExcelData" runat="server" onrowdatabound="GridView2_RowDataBound"> 
    <HeaderStyle BackColor="#df5015" Font-Bold="true" ForeColor="White" /> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
       <asp:DropDownList ID="DrdDatabase" Width="100px" runat="server"> 
       </asp:DropDownList> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 

है और gridview के लिए अपने RowDataBound घटना

protected void GridView2_RowDataBound(object sender, GridViewRowEventArgs e) 
    { 
     string cities = "maxico,chennai,newdelhi,hongkong"; 
     string [] arr = cities.Split(','); 
    // Instead of string array it could be your data retrieved from database. 
     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      DropDownList ddl = (DropDownList)e.Row.FindControl("DrdDatabase"); 
      foreach (string colName in arr) 
       ddl.Items.Add(new ListItem(colName)); 
     } 
    } 
+0

ऐसा नहीं लगता है कि यह डेटाबेस से जुड़ा हुआ है बल्कि इसके बजाय शहरों की सरणी से जुड़ा हुआ है। यदि कोई उपयोगकर्ता ड्रॉप-डाउन में परिवर्तन करता है तो यह डेटाबेस को कैसे अपडेट करेगा? –

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