Как получить идентификатор серверного элемента управления в GridView? - PullRequest
1 голос
/ 28 мая 2011

Я пытаюсь получить доступ к серверному элементу управления, который находится внутри GridView, но я понятия не имею, как это сделать .. Вот моя попытка:

<asp:GridView ....
.....
  <Columns>
    <asp:TemplateField>
      ...
      ..
      <EditItemTemplate>
        <asp:TextBox ID="txtName"runat="server" Text='<%# Bind("Name") %>' />
      </EditItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="edit" ItemStyle-CssClass="td" 
                       HeaderStyle-CssClass="listtitle">
      <ItemTemplate>
        <asp:ImageButton ID="btnEdit" runat="server" CommandName="Edit" 
                         AlternateText="edit" ImageUrl="~/css/images/edit-icon.png" />
      </ItemTemplate>
      <EditItemTemplate>
        <asp:LinkButton ID="btnUpdate" runat="server" CommandName="Update" Text="Save" 
                        OnClientClick="javascript:return isValid('<%= txtName.ClientID%>')" /> | 
        <asp:LinkButton ID="btnCancel" runat="server" 
                        CommandName="Cancel" Text="Cancel" />
      </EditItemTemplate>
    </asp:TemplateField>
    ...
    ..
  </Columns>
  .....
  ....
</asp:GridView>

Проблема здесь

OnClientClick="javascript:return isValid('<%= txtName.ClientID%>')"

Когда он попадает в функцию isValid, я вижу строку "<% = txtName.ClientID%>", а не фактический идентификатор контроллера, как я должен ..

Итак, вопрос в том, как я могу отправить идентификатор в сценарий JS?

Ответы [ 3 ]

0 голосов
/ 29 мая 2011

ibrams ответ был бы правильным, если бы поля были на ItemTemplate. Но это не сработает, когда вы используете EditItemTemplate, нужно также проверить RowState. Состояние будет примерно таким

if ((e.Row.RowState == (DataControlRowState.Edit | DataControlRowState.Alternate)) || (e.Row.RowState == DataControlRowState.Edit)) 
{
    //logic here
}

Но более короткое решение будет проверять это условие GridView1.EditIndex == e.Row.RowIndex

Фрагмент должен быть таким.

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow && GridView1.EditIndex == e.Row.RowIndex)
    {
        TextBox txt = (TextBox)e.Row.FindControl("txtName");
        LinkButton btn = (LinkButton)e.Row.FindControl("btnUpdate");
        string script = String.Format("javascript:return isValid('{0}')", btn.ClientID);
        btn.Attributes.Add("onclick", script);
    }
}
0 голосов
/ 29 мая 2011

Поскольку вы хотите проверить значение текстового поля txtName, гораздо лучше использовать стандартные средства проверки asp.net.Если у вас есть некоторые полные правила проверки, вы можете использовать CustomValidator и указать функцию javascript для обработки проверки на стороне клиента.Просто установите одно и то же значение группы валидации для валидатора, прикрепленного к элементу управления txtName, и для кнопки btnUpdate.

0 голосов
/ 29 мая 2011

В событии RowDataBound вам необходимо прочитать идентификатор клиента вашего txtName и установить OnClientClick вашей кнопки ссылки.

void myGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        TextBox txt = (TextBox)e.Row.FindControl("txtName");
        Button btn = (LinkButton)e.Row.FindControl("btnUpdate");
        btn.OnClientClick = String.Format("javascript:return isValid('{0}')", btn.ClientID);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...