Ответ 1
После того, как тыкаешь вокруг, похоже, что Келси прав.
Просто используйте запятую или что-то подобное и разделите ее, когда хотите ее использовать.
У меня есть gridview с несколькими строками, каждая из которых имеет кнопку "Обновить", и мне нужно передать 2 значения, когда кто-то нажимает кнопку "Обновить". Помимо упаковки аргументов внутри CommandArgument, разделенных запятыми (архаичными и не изящными), как бы передать более одного аргумента?
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>
Как примечание, значения не могут быть получены из любых элементов управления на странице, поэтому не предлагайте никаких дизайнерских решений. Пожалуйста, сосредоточьтесь на вопросе. Спасибо заранее.
После того, как тыкаешь вокруг, похоже, что Келси прав.
Просто используйте запятую или что-то подобное и разделите ее, когда хотите ее использовать.
Вы можете передавать значения разделенной точкой с запятой в качестве аргумента команды, а затем разделять строку и использовать ее.
<asp:TemplateField ShowHeader="false">
<ItemTemplate>
<asp:LinkButton ID="lnkCustomize" Text="Customize" CommandName="Customize" CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>' runat="server">
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
на стороне сервера
protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
string[] arg = new string[2];
arg = e.CommandArgument.ToString().Split(';');
Session["IdTemplate"] = arg[0];
Session["IdEntity"] = arg[1];
Response.Redirect("Samplepage.aspx");
}
Надеюсь, что это поможет!!!!
@Ответ Patrick - хорошая идея, и он заслуживает большего кредита!. Вы можете иметь столько элементов данных, сколько хотите, все они разделены, и при необходимости их можно использовать на стороне клиента.
Они также могут быть добавлены декларативно, а не в коде. Я просто сделал это для GridView следующим образом:
<asp:TemplateField HeaderText="Remind">
<ItemTemplate>
<asp:ImageButton ID="btnEmail"
data-rider-name="<%# ((Result)((GridViewRow) Container).DataItem).Rider %>"
data-rider-email="<%# ((Result)((GridViewRow) Container).DataItem).RiderEmail %>"
CommandName="Email" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/images/email.gif" />
</ItemTemplate>
</asp:TemplateField>
В RowCommand вы выполните следующее:
void gvMyView_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Email")
{
var btnSender = (ImageButton)e.CommandSource;
var riderName = btnSender.Attributes["data-rider-name"];
var riderEmail = btnSender.Attributes["data-rider-email"];
// Do something here
}
}
Так намного чище, чем взламывать все значения вместе с разделителями и снова распаковывать в конце.
Не забудьте проверить/очистить все данные, которые вы вернетесь со страницы, если они были подделаны!
Мой подход использует коллекцию атрибутов для добавления атрибутов данных HTML из кода позади. Это больше похоже на сценарии jquery и на стороне клиента.
// This would likely be done with findControl in your grid OnItemCreated handler
LinkButton targetBtn = new LinkButton();
// Add attributes
targetBtn.Attributes.Add("data-{your data name here}", value.ToString() );
targetBtn.Attributes.Add("data-{your data name 2 here}", value2.ToString() );
Затем извлеките значения через коллекцию атрибутов
string val = targetBtn.Attributes["data-{your data name here}"].ToString();
Несколько более элегантный способ сделать то же самое добавление к вышеуказанному комментарию.
<asp:GridView ID="grdParent" runat="server" BackColor="White" BorderColor="#DEDFDE"
AutoGenerateColumns="false"
OnRowDeleting="deleteRow"
GridLines="Vertical">
<asp:BoundField DataField="IdTemplate" HeaderText="IdTemplate" />
<asp:BoundField DataField="EntityId" HeaderText="EntityId" />
<asp:TemplateField ShowHeader="false">
<ItemTemplate>
<asp:LinkButton ID="lnkCustomize" Text="Delete" CommandName="Delete" CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>' runat="server">
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</asp:GridView>
И на стороне сервера:
protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
string IdTemplate= e.Values["IdTemplate"].ToString();
string EntityId = e.Values["EntityId"].ToString();
// Do stuff..
}
Либо сохраните его в коллекции gridview datakeys, либо сохраните его в скрытом поле внутри одной ячейки или соедините значения вместе. Это единственный путь. Вы не можете сохранить два значения в одной ссылке.
Если вы хотите передать два значения, вы можете использовать этот подход
<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
OnClick="RemoveFromRole_Click" />
В основном я рассматриваю {CommmandName, CommandArgument} как значение ключа. Установите оба поля базы данных. Вам нужно будет использовать событие OnClick и использовать событие OnCommand
в этом случае, что, я думаю, более чистый код.