RmcbainTheThird Ответов: 2

Как получить идентификатор родительской строки в gridview при добавлении строки в nestedgridview


Хорошо,

когда я добавляю новую строку во вложенный gridview(gvBulletItems) и есть существующие строки, я могу получить Родительский идентификатор с помощью

gvBulletItems.DataKeys[0].Value

(Кстати, я ненавижу магические числа)

однако когда у меня есть родительский gridview без элементов во вложенных gridview DataKeys возвращается как null

Я определил свой EmptyDataTemplate таким образом:
 <EmptyDataTemplate>
  There are no Bullets for this bullet group. 
  <table id="tblnewbullets"  class="tbl-newItems" runat="server">
      <tr class="tbl-newItems">
         <td class="tbl-newItems" > List Order</td>
         <td> Display Text</td>
      </tr>
      <tr>
          <td>
             <asp:TextBox ID="txtbxNewListOrder" runat="server"></asp:TextBox>
          </td>
          <td>
             <asp:TextBox ID="txtbxNewDisplayText" runat="server"></asp:TextBox>
          </td>
          <td>
             <asp:LinkButton ID="linkAddBullet" CommandName="AddNewBullet" runat="server">Add</asp:LinkButton>
          </td>
       </tr>
    </table>
</EmptyDataTemplate>


и это определялось раньше

<Columns>
.....
</Columns>


Одна из вещей, о которых я подумал, заключалась в том, что я мог бы это сделать из идентификатора div, который вложенный gridview в качестве его идентификатора определяется как
"div<%# Eval("BulletGroupID") %>"

но когда я смотрю, это не удостоверение личности.

вот код, который связывает оба вида сетки

if (row.RowType == DataControlRowType.DataRow)
     {
        InfoCenterParent icParent = (InfoCenterParent)Session[PARENT];
        List<InfoCenterBulletGroup> bulletGroupsData = icParent.bulletGroups;
        Label lblGroupBulletID = (Label)row.FindControl("lblBulletGroupID");
        int BulletGroupID = int.Parse(lblGroupBulletID.Text);
        InfoCenterBulletGroup bg = bulletGroupsData.Single(b => b.BulletGroupID == BulletGroupID);
        GridView gvBulletItems = new GridView();
        gvBulletItems = (GridView)row.FindControl("gvBulletItems");
        gvBulletItems.DataSource = bg.bulletItems;
        gvBulletItems.DataBind();
     }


и вот как я получаю BulletgroupID в OnRowCommand вложенного gridview
gvBulletItems.DataKeys[0].Value.ToString()

этот объект(gvBulletItems.DataKeys) не является нулевым, если я добавляю bulletitem в gridview, который имеет существующие элементы
однако если я добавляю к вложенному gridview который не имеет элементов то он возвращается как null

Вот объект, который привязывается к gridviews
public class InfoCenterBulletGroup  
    {  
        public int BulletGroupID { get; set; }
        public int InfoCenterID { get; set; }
        public string DisplayText { get; set; }
        public int ListOrder { get; set; }
        public List<InfoCenterBulletItem> bulletItems { get; set; }
        public string LastUpdatedBy { get; set; }
        public DateTime LastUpdatedDate { get; set; }
    }
    public class InfoCenterBulletItem
    {
        public int BulletID { get; set; }
        public int BulletGroupID { get; set; }
        public int ListOrder { get; set; }
        public string DisplayText { get; set; }
        public string LastUpdatedBy { get; set; }
        public DateTime LastUpdatedDate { get; set; }
    }


Что я уже пробовал:

Я уже пробовал назначать
<%# Eval("BulletGroupID") %>"

чтобы пометить текст в моем emptyDataTemplate

Я перерыл все свойства обоих gridviews
Я изношу свою клавиатуру с помощью поиска в Google

2 Ответов

Рейтинг:
4

RmcbainTheThird

Хорошо, это немного хак, но мое решение состояло в том, чтобы добавить элемент в таблицу БД, который заполняет вложенную сетку gridview, когда я создаю запись в таблице БД, которая заполняет родительское представление сетки.

InfoCenterBulletGroup bg = new InfoCenterBulletGroup();
     int.TryParse(txtbxListOrder.Text, out tmp);
     bg.DisplayText = txtbxDisplayText.Text;
     bg.ListOrder = tmp;
     bg.LastUpdatedBy = _nbid;
     bg.InfoCenterID = int.Parse(hParentID.Value);
     InfoCenterData sql = new InfoCenterData(_connString);
     int bulletGroupID = sql.AddBulletGroup(bg);
     InfoCenterBulletItem bulletItem = new InfoCenterBulletItem();
     bulletItem.BulletGroupID = bulletGroupID;
     bulletItem.DisplayText = "New Bullet";
     bulletItem.ListOrder = 0;
     bulletItem.LastUpdatedBy = _nbid;
     sql.AddBulletItem(bulletItem);
     UpdateParentObject();
     InfoCenterParent icParent = (InfoCenterParent) Session[PARENT];
     List<InfoCenterBulletGroup> bulletGroupsData = icParent.bulletGroups;
     gvBulletGroup.DataSource = bulletGroupsData;
     gvBulletGroup.DataBind();
     txtbxListOrder.Text = string.Empty;
     txtbxDisplayText.Text = string.Empty;


Рейтинг:
2

Vincent Maverick Durano

Я не совсем уверен, что именно является вашей целью. Один GridView строки не имеют ID однако вы можете ссылаться на строку, приведя sender из object это запускает событие. Например, в вашем приложении Button, вы можете что-то вроде этого:

protected void LinkButton1_Click(object sender, EventArgs e){
        LinkButton lb = (LinkButton)sender;
        GridViewRow row = (GridViewRow)lb.NamingContainer;

        //here the row variable is the row of your parent GridView

}


RmcbainTheThird

True the row does not have an ID but it does have columns and what I need to do is get the value of one of those columns when adding a child row We have a one to many relationship between the data in the parent/top gridview and the child/nested gridview. When the parent row has one or more child records(the nested gridview) and I want to add addition rows/records I can get the value of the column that defines that relationship by getting the value of gvBulletItems.DataKeys[0].Value. gvBulletItems being the child gridview and the sender parm on the RowComandEvent. However if there are no rows in the childgridview then for whatever reason gvBulletItems.DataKeys[0] is null. I need to get the data stored in one of the columns (the unique ID)of parent row that defines the relationship between the parent gridview and the new row I am adding to the child gridview.

Vincent Maverick Durano

Не могли бы вы обновить свой вопрос и включить код, связывающий ваш GridView, а также как вы получаете доступ к DataKey в RowCommand?