2017-07-17 3 views
0

Ich habe ein Problem, das mich verrückt gemacht hat. Jede Hilfe würde sehr geschätzt werden. Ich habe eine Rasteransicht, die anzeigt, welche Forschungsgegenstände welchen Personen zugewiesen sind. Es sollte möglich sein, die Zuweisungen über ein Dropdown-Menü zu ändern. Hier ist der Auszeichnungs:Asp.net Gridview mit Dropdown: Rowindex ist immer 0 in SelectedIndexChanged Ereignis

<asp:GridView ID="assignmentsGridView" runat="server" AutoGenerateColumns="false" CellPadding="2" Font-Size="Smaller" 
 
OnRowDataBound="assignmentsGridView_RowDataBound" OnRowCommand="assignmentsGridView_RowCommand"> 
 
<Columns> 
 
    <asp:BoundField HeaderText="Ticker" DataField="Item" /> 
 
    <asp:BoundField HeaderText="Name" DataField="Name" /> 
 
    <asp:TemplateField HeaderText="Assignment" ItemStyle-HorizontalAlign="Center" ControlStyle-Font-Size="Small"> 
 
     <ItemTemplate> 
 
      <asp:DropDownList ID="assignmentDropDown" runat="server" Visible="true" 
 
       OnSelectedIndexChanged="assignmentDropDown_SelectedIndexChanged" AutoPostBack="true" > 
 
       <asp:ListItem Text="Joe" Value="Joe"></asp:ListItem> 
 
       <asp:ListItem Text="Aron" Value="Aron"></asp:ListItem> 
 
       <asp:ListItem Text="Frank" Value="Frank"></asp:ListItem> 
 
       <asp:ListItem Text="Ross" Value="Ross"></asp:ListItem> 
 
       <asp:ListItem Text="Alex" Value="Alex"></asp:ListItem> 
 
      </asp:DropDownList> 
 
     </ItemTemplate> 
 
    </asp:TemplateField> 
 
    <asp:BoundField HeaderText="Analyst Complete" DataField="AnalystComplete" ItemStyle-HorizontalAlign="Center" ControlStyle-Font-Size="Smaller"/> 
 
    <asp:TemplateField HeaderText="Mark Complete" ControlStyle-Font-Size="Smaller"> 
 
     <ItemTemplate> 
 
      <asp:Button ID="completeButton" runat="server" Text="Incomplete" CommandArgument='<%# Eval("Item") %>' 
 
       CommandName="Complete" Font-Size="Smaller" /> 
 

 
     </ItemTemplate> 
 
    </asp:TemplateField> 
 

 
</Columns> 
 
</asp:GridView>

Ich mag die Datenbank aktualisieren, wenn der Benutzer die SelectedIndex der Dropdown ändert. Ich bin Umgang dass hier:

protected void assignmentDropDown_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (Session["IsCompany"] == null) 
    { 
     Session["IsCompany"] = assignmentsDropDown.SelectedValue == "Company"; 
    } 
    bool? isCompany = Session["IsCompany"] as bool?; 
    int isCo = (isCompany == true) ? 1 : 0; 

    DropDownList ddl = sender as DropDownList; 
    GridViewRow gvr = ddl.NamingContainer as GridViewRow; 
    //ri is always 0! 
    int ri = gvr.RowIndex; 
    gvr = (GridViewRow)(((Control)sender).NamingContainer); 
    //ri is always 0! 
    ri = gvr.RowIndex; 
    gvr = ((GridViewRow)ddl.Parent.Parent); 
    //ri is always 0! 
    ri = gvr.RowIndex; 

    string selAnalyst = ddl.SelectedValue; 
    //selAnalsyt always = initial value! 
    selAnalyst = ddl.SelectedItem.Value; 
    //selAnalsyt always = initial value! 
    string ticker = gvr.Cells[0].Text; 
    //ticker always is first data row 
} 

Wie Sie in den Kommentaren sehen können, unabhängig davon, welche Zeile ich auf, die GridViewRow mit dem Absender Argumente zugeordnet ist immer die erste Zeile. Außerdem ist der ausgewählte Wert des Dropdown-Menüs immer der Anfangswert und nicht der Wert, der vom Benutzer ausgewählt wurde, der das SelectedIndexChanged-Ereignis ausgelöst hat.

Ich habe online nach einer Lösung für dieses Problem gesucht und festgestellt, dass es oft verursacht wird durch (1) das Databind-Ereignis, das auf Postback ausgelöst wird, und (2) doppelte Zeilen in den Quelldaten. Ich habe nach doppelten Daten gesucht und dieses Problem gelöst und Primärschlüssel auf die entsprechende Tabelle gesetzt. Ich stelle auch sicher, dass die Daten beim Postback nicht neu gebunden werden. Hier ist die Page_Load-Methode:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.User.Identity.IsAuthenticated) 
    { 
     FormsAuthentication.RedirectToLoginPage(); 
    } 
    else 
    { 
     string userName = Page.User.Identity.Name; 
     if (Session["UserMod"] == null) 
     { 
      this.userMod = new userModel(userName); 
     } 
     else 
     { 
      this.userMod = Session["UserMod"] as userModel; 
     } 

     if (!IsPostBack) 
     { 
      getPeopleList(userName); 
      getTickerList(userName); 


      if (this.userMod.IsResearchAdmin) 
      { 
       getAdminList(); 
      } 
      else 
      { 

       assignmentsDropDown.Visible = false; 
       assignmentsGridView.Visible = false; 
       assignmentsButton.Visible = false; 
       assignmentsLabel.Visible = false; 
       addTextBox.Visible = false; 
       Image1.Visible = true; 
       analystDropdown.Visible = false; 
      } 
     } 
    } 
} 

ich auch eine RowDataBound Methode haben, die den ausgewählten Wert der Drop-Down für jede Zeile setzt. Beim Debugging habe ich überprüft, dass die Methode nur beim ersten Laden der Seite und nicht nach dem Postback von SelectedIndexChanged ausgeführt wird. Ich benutzte auch ein Update-Panel, aber entfernte das, während ich versuchte, dies zu debuggen.

Ich bin jetzt alle outta Ideen, also bin ich für irgendwelche Vorschläge offen. Vielen Dank im Voraus

+0

Haben Sie den Code debuggt? Ich habe deinen Code auf meinem Computer ausprobiert und es hat perfekt funktioniert. 'gvr.RowIndex;' gibt mir sicher den richtigen Index. Wenn Sie die Werte in der Dropdown-Liste der ersten Zeile ändern, ist der Wert Null. Versuchen Sie, den Wert in einer anderen Zeile zu ändern und zu debuggen ... Sie sollten den richtigen Index erhalten. –

+0

Ja, ich habe es gerade wieder debuggt und genau das gleiche Problem erlebt. Ich bin hier eher ratlos. –

Antwort

0

Es sieht aus wie ich eine seltsame Idiosynkrasie von asp.net entdeckt habe. Ich hatte den folgenden Code in der RowDataBound Methode:

if (IsCompany) 
    { 
     e.Row.Cells.Remove(e.Row.Cells[1]); 
    } 

ich diesen Code entfernt und die Drop-down SelectedIndexChanged Methode funktioniert nun korrekt. Alle drei Methoden zum Abrufen der übergeordneten GridViewRow der Dropdownliste funktionieren nach dem Ändern der RowDataBound-Methode, sodass keine Zellen in der Gridview entfernt werden.

Ich jetzt glaube, dass das Hinzufügen oder Entfernen von Zellen während der Datenbindung unerwartete Probleme mit dem SelectedIndexChanged -Ereignis für Dropdown-Menüs in GridViews verursacht. Hier ist der vollständige Code des RowDataBoundMethod:

protected void assignmentsGridView_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (Session["IsCompany"] == null) 
    { 
     Session["IsCompany"] = entityDropDown.SelectedValue == "Company"; 
    } 
    bool? isCompany = Session["IsCompany"] as bool?; 
    bool IsCompany = (bool)isCompany; 

    TableCell cell; 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 

     cell = e.Row.Cells[0]; 
     HyperLink link = new HyperLink(); 
     if (IsCompany) 
     { 
      link.NavigateUrl = "~/CompanyPage.aspx?Ticker=" + cell.Text; 
     } 
     else 
     { 
      link.NavigateUrl = "~/PeoplePage.aspx?PersonId=" + cell.Text; 
     } 
     link.Text = cell.Text; 
     cell.Controls.Clear(); 
     cell.Controls.Add(link); 
     /* with this code included, I experience problems with the SelectedIndexChanged event of the dropdown 
     if (IsCompany) 
     { 
      e.Row.Cells.Remove(e.Row.Cells[1]); 
     } 
     */ 

     cell = e.Row.Cells[2]; 

     var dd = e.Row.FindControl("assignmentDropDown") as DropDownList; 
     string assignment = ((DataRowView)e.Row.DataItem)["Assignment"].ToString(); 
     foreach (ListItem li in dd.Items) 
     { 
      if (li.Value == assignment) 
      { 
       li.Selected = true; 
       break; 
      } 
     } 
     cell = e.Row.Cells[4]; 
     if (cell.Text == "False") 
     { 
      //"completeButton" 
      var cb = e.Row.FindControl("completeButton") as Button; 
      cb.Enabled = false; 
      cb.Visible = false; 
     } 
     else 
     { 
      ((Button)cell.FindControl("completeButton")).CommandArgument = e.Row.RowIndex.ToString(); 
     } 
    } 
} 

Wenn jemand bestätigen könnte, dass die Zellen im Inneren RowDataBound verursacht Probleme mit dem ausgewählten Index Änderungsereignis in asp.net Entfernen wir es schätzen würden.

+0

Sie müssen den Code des rowdatabound Ereignis auch teilen. –

Verwandte Themen