Frage

Ich habe ein paar Bild Buttons in meinem Gridview, aber ich kann das Click-Ereignis nicht erfassen. Weder ein Click-Ereignis zu schaffen, noch in den gridview Werken einen OnRowCommand Handler zu schaffen.

die Tasten einfach Klicken auf Postbacks auf die aktuelle Seite.

Ich füge meine Tasten wie folgt aus:

protected void gridview1_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string status = DataBinder.Eval(e.Row.DataItem, "visitstatusuid").ToString();

        string visitUID = DataBinder.Eval(e.Row.DataItem, "visituid").ToString();

        Color backColor = Color.White;
        Color foreColor = Color.Black;

        ImageButton b;

        switch (status)
        {
            case "U": // Unallocated
                backColor = ColorTranslator.FromHtml("#B2A1C7");
                b = new ImageButton();
                b.Width = Unit.Pixel(25);
                b.Height = Unit.Pixel(30);
                b.AlternateText = "Book";
                b.ImageUrl = "../../Images/New/booking.gif";
                b.ToolTip = "Booking";
                b.CommandName = "Booking";
                b.CommandArgument = visitUID;
                b.CausesValidation = false;

                e.Row.Cells[(e.Row.Cells.Count - 3)].Controls.Add(b);

etc.

War es hilfreich?

Lösung

Sie müssen die Handler befestigen, wenn die Schaltfläche erstellt wird:

b.Click += MyButtonClickEventHandler;

Bearbeiten :
Statt auf die Schaltfläche im OnRowDataBound Handler erstellen, verwenden Sie OnRowCreated.
Dadurch wird sichergestellt, die Taste auf Postbacks neu erstellt wird.

Beispiel:

protected void Page_Load(object sender, EventArgs e)
{
  if (!IsPostBack) {
    BindData();
  }
}

protected void BindData()
{
  // Do your databinding here.
}

protected void MyGridView_RowCreated(object sender, GridViewRowEventArgs e)
{
  var b = new ImageButton();
  b.AlternateText = "Click Me!";
  // Etc.

  b.Click += MyButton_Click;
  // Add the button to the column you want.
}

protected void MyButton_Click(object sender, ImageClickEventArgs e)
{
  // Do your thing...
}

Andere Tipps

Wenn Sie einen Event-Handler an anderer Stelle hinzufügen, Sie würden AutoEventWireup="true" in der Seitendirektive Ihrer aspx Datei festlegen müssen.

Dass gesagt wird ziehe ich ausdrücklich Ereignisse so, anstatt Verwendung AutoEventWireup fügen Sie folgende Zeile zu OnInit Methode Verdrahtung:

gridview1.RowDataBound += this.gridview1_RowDataBound;

Für Ihren Ansatz RowDataBound mit arbeiten, müssen Sie das Gitter auf jeder Seite zu laden erneut zu binden, und sicherzustellen, dass Sie sie tun spätestens OnLoad im Lebenszyklus, um für das Click-Ereignis in der Zeit registriert werden.

Ein alternativer Ansatz, den ich Erfolg gehabt habe mit ist eine neue Methode für das Erledigen der Datagrid-Taste Setup zu erstellen, zum Beispiel

void PerformConditionalGridFormatting()
{
    foreach (GridViewRow row in gvCaseList.Rows)
    {
        if (row.RowType == DataControlRowType.DataRow)
        {
             ... Add your buttons to the cells here
        }
    }
}

Dann ist die Methode, die Sie rufen jedes Mal, wenn Sie eine manuelle databind durchführen und auch auf jedem Postback das heißt in der OnLoad-Handler tun:

if (Page.IsPostBack) PerformConditionalGridFormatting();

Der Vorteil dieses Ansatzes besteht darin, dass Sie sich auf jedem Postback nicht Databind, die Ressourcen geschont.

erstellen RowCommand Ereignishandler für das gridview und prüfen Sie die Befehlsnamen, um zu sehen, ob es Ihre Taste ist auslösenden es

etwas zum Effekt von

void gridview1_RowCommand(object sender, args e)
{

if (e.CommandName == "Booking")
{
// call your desired method here
}

}

Setzen Sie das Bindungsereignis des Gitters in nicht Post zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top