Laden...

Im EventHandler herausbekommen, welchen Index das auslösende Objekt hat

Erstellt von w1z4rd2003 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.801 Views
w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 14 Jahren
Im EventHandler herausbekommen, welchen Index das auslösende Objekt hat

hallo zusammen,

ich habe ein problem und zwar weiss ich nicht genau wie ich es angehen soll.
zum problem selber, ich habe in meinem code eine table erstellt


 // Tabelle initialisieren
HtmlTable objTable;
HtmlTableRow objRow;
HtmlTableCell objCellTitel1, objCellTitel2, objCellTitel3, objCellTitel4;


 objTable = new HtmlTable();

// Header

            //-------------------------------------
objRow = new HtmlTableRow();
objTable.Rows.Add(objRow);

objCellTitel1 = new HtmlTableCell();
objCellTitel1.InnerHtml = "Titel1";
objCellTitel2 = new HtmlTableCell();
objCellTitel2.InnerHtml = "Titel2";
objCellTitel3 = new HtmlTableCell();
objCellTitel3.InnerHtml = "Titel3";
objCellTitel4 = new HtmlTableCell();
objCellTitel4.InnerHtml = "Titel4";

objRow.Controls.Add(objCellTitel1 );
objRow.Controls.Add(objCellTitel2);
objRow.Controls.Add(objCellTitel3);
objRow.Controls.Add(objCellTitel4);
objTable.Controls.Add(objRow);
//-----------------------------------------------

um die rows zu erstellen werden aus einer db die items gelesen. ich habe das ganze in einer foreach schleife gepackt sodass die rows und der inhalt der cells dynamisch generiert wird.

zuerstmal lese ich die Anzahl der Items in der db aus:

List<MyTable_V> items = MyTable_V.GetAll();
int itemcount = items.count;

                     int i = 0;
                    _chkSubscriberCheckbox = new CheckBox[itemcount ];

                    foreach (MyTable_V item in items)
                    {
                        
                        _chkSubscriberCheckbox[i] = new CheckBox();
                        _chkSubscriberCheckbox[i].Style.Add("cursor", "hand");
                        _chkSubscriberCheckbox[i].ID = _chkSubscriberCheckbox[i].ClientID;
                        _chkSubscriberCheckbox[i].AutoPostBack = true;

                       

                        _chkSubscriberCheckbox[i].CheckedChanged += new EventHandler(_chkSubscription_CheckedChanged);
                        

                        objTable.Rows.Add(objRow2);

                        objCell1 = new HtmlTableCell();
                        objCell1.InnerHtml = item.Name;

                        objCell2 = new HtmlTableCell();
                        objCell2.InnerHtml = item.Titel;

                        objCell3 = new HtmlTableCell();
                        objCell3.Controls.Add(_chkSubscriberCheckbox);

                        objCell4 = new HtmlTableCell();
                        objCell4.InnerHtml = item.Url;

                        objRow2.Controls.Add(objCell1);
                        objRow2.Controls.Add(objCell2);
                        objRow2.Controls.Add(objCell3);
                        objRow2.Controls.Add(objCell4);

                        objTable.Controls.Add(objRow2);
                        
                        i = i + 1;
                    }

Mein Problem ist jetzt dass alles super läuft bis zum EventHandler. Ich müsste im Eventhandler sagen zu welcher Checkbox der Event gehört mittels z.B i.
Aber das geht ja nicht weil ich in diesem zeitpunkt ausserhalb der Schleife bin.
Ich weiss nicht wie ich das lösen soll. Wäre froh um jeden Tipp.

        /// <summary>
        /// Checkbox Event
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void _chkSubscription_CheckedChanged(object sender, EventArgs e)
        {
            if (_chkSubscriberCheckbox[3].Checked)
            {
                
                _lblActionMessage.Text = "Sie haben die Checkbox" + i + "aktiviert";
            }
            else
            {
                 _lblActionMessage.Text = "Sie haben die Checkbox" + i + "deaktiviert";
            }
            }

Gruss und Danke

731 Beiträge seit 2006
vor 14 Jahren

Hi,

würde es dir vielleicht etwas bringen, wenn du einfach an die Tag-Eigenschaft einer Checkbox ihren Index hängst und diesen kannst du im CheckedChanged-Handler über den "sender" abfragen.

MfG
wax

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 14 Jahren

Hallo Wax,

Vielen Dank für dein Tipp.

In meiner chkSubscriberCheckbox sehe ich aber keine Tag Eigenschaft.

Ich sehe zwar was du meinst, somit würde ich beim aufruf vom Event dem Sender diesen Index mitgeben und dieser kann ich dann im Event brauchen.

Aber mir ist noch nicht klar wie ich das der Checkbox anhanängen muss und wie ich das dann im Event lesen kann.

Gruss und danke

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo w1z4rd2003,

erstmal ist die Frage, ob du den Index überhaupt brauchst, wenn du doch in sender die CheckBox selbst hast.

Ansonsten wie schon von Wax gesagt: CheckBox.Tag.

herbivore

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 14 Jahren

hallo herbivore,

das mit den tags ist mir jetzt klar wie es funktioniert.

zum beispiel:


  private void aCheckBox_CheckedChanged(object sender, EventArgs e)
  {
      int rowIndex = (int)((CheckBox)sender).Tag;
      checkArray[rowIndex].Checked = !(checkArray[rowIndex].Checked || 
                                         checkArray[rowIndex].Checked);
  }


an meiner Checkbox kann ich aber keine Tag Eigenschaft zuweisen. Wenn ich das könnte wäre mein Problem schon gelöst.

_chkSubscriberCheckbox[i].
49.485 Beiträge seit 2005
vor 14 Jahren

Hallo w1z4rd2003,

an meiner Checkbox kann ich aber keine Tag Eigenschaft zuweisen.

da _chkSubscriberCheckbox ja wohl ein CheckBox-Array ist, wüsste ich keinen Grund, warum das nicht gehen sollte.

_chkSubscriberCheckbox[i].Tag = i;

herbivore

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 14 Jahren

hallo herbivore,

ich bekomme diesen Error beim builden

Error 2 'System.Web.UI.WebControls.CheckBox' does not contain a definition for 'Tag' and no extension method 'Tag' accepting a first argument of type 'System.Web.UI.WebControls.CheckBox' could be found (are you missing a using directive or an assembly reference?)

Gruss

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo w1z4rd2003,

dann dürfte aber auch int rowIndex = (int)((CheckBox)sender).Tag; nicht funktionieren.

CheckBox.Tag gibt es bei Windows-Forms, nicht bei Web-UI. Da musst du auf was anderes ausweichen, z.B. die ID.

herbivore

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 14 Jahren

Hallo herbivore,

Vielen Dank für den Hinweis. Ich werde das umprogramieren müssen.

Mir ist aber noch eine allgemeine Frage aufgetaucht.
In der foreach Schleife gehe ich ja jedes Item durch der in der db gespeichert ist.

Wenn ich beim selektieren der Checkbox jeweils den aktuellen Item einfügen oder löschen will. Muss das ganze dann wieder über diese senders passieren?

Das würde dann heissen ich müsste jedem item in items eine id vergeben und diesen dann analog wie mit der Checkbox machen?

List<MyTable_V> items= MyTable_V.GetAll();

foreach (MyTable_V item in items)
     {
 ....
}

Oder wie wäre es am schönsten und am besten?

Gruss

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 14 Jahren

CheckBox.Tag gibt es bei Windows-Forms, nicht bei Web-UI. Da musst du auf was anderes ausweichen, z.B. die ID.

und was ist wenn man mehrere controls hat? Man kann ja nicht an einer checkbox und z.b einem timer die ID 'i' geben. das würde dann heissen beim jedem durchlauf der schleife würden alle controls die gleiche id haben.

ich habe die ID so erstellt das ich ein String und danach das i angehängt habe.

_chkSubscriberCheckbox[i].ID = "_chkSubscriberCheckbox" + i.ToString();
_timPopupTimer[i].ID = "_timPopupTimer" + i.ToString();

was heissen würde dass danach der Timer irgendwie in so einer Art aufgerufen wird.
Funktioniert zwar aber wenn mehr als 9 rows dynamisch erstellt werden wird es nicht mehr funktionieren da die ich ein Substring mache um das letzte Zeichen auszulesen. wenn es dann eine 10 ist klappts nicht mehr.
Es ist auch mehr ein gebastel, darum die frage: gibt es eine Möglichkeit dieses Problem zu umgehen in einer schönen und professionellen Art?

        
        void timer_Tick(object sender, EventArgs e)
        {
            string timerIndex = (string)((Timer)sender).ID;
            string index = Right(timerIndex, 1);
            _timPopupTimer[int.Parse(index)].Enabled = false;
            _panPopupPanel[int.Parse(index)].Visible = false;

        }

Gruss

w1z4rd2003 Themenstarter:in
624 Beiträge seit 2006
vor 14 Jahren

Habe es jetzt mit der SkinID gemacht.
Die SkinID muss nicht unique sein.

M
205 Beiträge seit 2008
vor 14 Jahren

Zur Eränzung würde es auch so funktionieren:


            if ( sender is CheckBox )
            {
                int Index = Array.IndexOf<CheckBox> ( _chkSubscriberCheckbox , (CheckBox) sender );
            }

mfg Markus