selectedindexbound в динамически созданном виде сетки - PullRequest
0 голосов
/ 07 января 2010

Я динамически создал вид сетки, теперь я хочу вызвать событие, когда выбранный индекс изменился.

 GridView NewDg = new GridView();
 NewDg.ID = "SubGridView" + e.Row.RowIndex.ToString();
 NewDg.DataKeyNames = new string[]{"logentry_id"};
 NewDg.SelectedIndexChanged += new EventHandler(NewDg_SelectedIndexChanged);
 NewDg.RowDataBound += new GridViewRowEventHandler(NewDg_RowDataBound);

RowDataBound работает, но он не производит правильный URL обратной передачи, я думаю. В RowDataBound у меня есть следующий код:

GridView sendingGridView = (GridView)sender;
e.Row.Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);

это дает следующий код:

javascript:__doPostBack('SubGridView4','Select$0')

Только это не приводит к обратной передаче этой функции:

        void NewDg_SelectedIndexChanged(object sender, EventArgs e)
    {

        GridView sendingGridView = (GridView)sender;
        ViewDetails(Convert.ToInt32(sendingGridView.SelectedDataKey["logentry_id"].ToString()));
    }

Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 08 января 2010

Я нашел ответ на свой вопрос в Code Project :

Теперь я использую gridview в моем gridview

            <asp:TemplateField>
            <ItemTemplate>
                <asp:GridView ID="SubGridView" 

Из-за расширения в GridView, представление сетки будет отображаться, когда я нажимаю на знак плюса (см. Ссылку)

при загрузке страницы я выполняю следующее:

        protected void Page_Load(object sender, EventArgs e)
    {
        GridView1.RowCreated += new GridViewRowEventHandler(GridView1_RowCreated);
        GridView1.DataSource = dc.GetLogEntriesWithUsername();
        GridView1.DataBind();

У меня уже есть событие DataBound и Selected Index Changed в этом виде сетки.

В строке, созданной событием, я выполняю следующее:

        void GridView1_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            GridView SubGridView = e.Row.FindControl("SubGridView") as GridView;
            List<GetLogEntriesWithUsernameByParentIdResult> subLogEntries = dc.GetLogEntriesWithUsernameByParentId(((GetLogEntriesWithUsernameResult)e.Row.DataItem).logentry_id).ToList();
            if (subLogEntries.Count > 0)
            {
                SubGridView.DataSource = subLogEntries;
                SubGridView.DataBind();
                (e.Row as ExtGridViewRow).ShowExpand = SubGridView.Rows.Count > 0;
            }
        }
    }

В подсетке у меня также есть событие DataBound и SelectedIndex Changed. Это работает сейчас!

Я использую это событие DataBound:

        protected void GridView_RowDataBound(object sender, GridViewRowEventArgs e)
    {        // only apply changes if its DataRow
        GridView sendingGridView = (GridView)sender;
        if (e.Row.RowType == DataControlRowType.DataRow)
        {
            // when mouse is over the row, save original color to new attribute, and change it to highlight yellow color
            e.Row.Attributes.Add("onmouseover",
          "this.originalstyle=this.style.backgroundColor;this.style.backgroundColor='#C0C0C0';this.style.cursor='pointer';");

            // when mouse leaves the row, change the bg color to its original value   
            e.Row.Attributes.Add("onmouseout",
            "this.style.backgroundColor=this.originalstyle;this.style.cursor='cursor'");
            //e.Row.Attributes.Add("onclick", ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex));

            e.Row.Cells[1].Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);
            e.Row.Cells[2].Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);
            e.Row.Cells[3].Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);
            e.Row.Cells[4].Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);
            e.Row.Cells[5].Attributes["onclick"] = ClientScript.GetPostBackClientHyperlink(sendingGridView, "Select$" + e.Row.RowIndex);

И выбранный индекс изменил событие:

        protected void GridView_SelectedIndexChanged(object sender, EventArgs e)
    {
        GridView sendingGridView = (GridView)sender;
        ViewDetails(Convert.ToInt32(sendingGridView.SelectedDataKey["logentry_id"].ToString()));         
    }

Функция ViewDetails отображает детали выбранного входа в другой div. Теперь я занят на последнем этапе, то есть продолжаю показывать данные такими, какими они были до того, как щелкнули строку.

Спасибо за помощь, но это решение моей проблемы.

0 голосов
/ 07 января 2010

Во-первых, вы воссоздаете сетку при каждой загрузке страницы? Это требование для создания сетки таким образом. Во-вторых, попробуйте подключиться к RowCommand и найти имя команды таким образом; может быть, это успешно сработает; вы получаете ссылку на команду через аргумент команды как в:

void rowcmd(..) {
   if (e.CommandName != null && e.CommandName.StartsWith("Select")) {
       //Dothis
   }
}
...